1. 程式人生 > >2018.10.03 NOI+模擬賽 解題報告

2018.10.03 NOI+模擬賽 解題報告

得分: 30+5+0=3530+5+0=35(考得真不咋滴)

T1T1:奧義商店(點此看題面

以為很簡單,對著這題想了一個多小時,最後果斷打了個暴力交了… …

看完題解發現其實也不是很難。

對於t=1t=1的情況,似乎與一道題目很像:【洛谷3396】雜湊衝突,可以用分塊來做。

LinkLink

對於t>1t>1的情況,似乎與暴力類似,但是要加一個玄學的優化。

如果有多種顏色,它們的數目分別為c1ctc_1\sim c_t,不難想到,給kk染上數目最少的顏色肯定是最優的。

我們用MinMin表示mi

n(ci)min(c_i)

則第k±xdk±xd個商品被選中的概率應為i=1xMini(n1)i\prod_{i=1}^x \frac{Min-i}{(n-1)-i}

因此它對答案造成的貢獻應為vk±xdi=1xMini(n1)iv_{k±xd}\prod_{i=1}^x \frac{Min-i}{(n-1)-i}

不難發現,這種方法是近似於O(n2)O(n^2)的,肯定會TT飛。

但是,我們必須要注意到,在t>1t>1

>1時,MinMin肯定是n2≤\frac{n}2的,因此這個式子的值是以指數級降低的),在大約6060次操作後對答案就不會造成任何影響了。

所以,我們就可以將操作次數與6060minmin,這樣跑起來就十分輕鬆了。

綜上所述,可以對tt進行分類討論,然後就是亂搞

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define
ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y) #define abs(x) ((x)<0?-(x):(x)) #define INF 1e9 #define Inc(x,y) ((x+=y)>=MOD&&(x-=MOD)) #define N 100000 using namespace std; int n,a[N+5]; class FIO { private: #define Fsize 100000 #define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++) #define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch)) int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize]; public: FIO() {FinNow=FinEnd=Fin;} inline void read(int &x) {x=0,f=1;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc()));x*=f;} inline void read_char(char &x) {while(isspace(x=tc()));} inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;} inline void write(int x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;} inline void write_char(char x) {pc(x);} inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) pc(x[i]);} inline void end() {fwrite(Fout,1,FoutSize,stdout);} }F; class Key1//處理t=1的情況,與雜湊衝突類似 { private: #define SqrtN 250 int s[N+5][SqrtN+5]; public: inline void Init() {for(register int i=1,j;i<=n;++i) for(j=1;j<SqrtN;++j) s[j][i%j]+=a[i];}//初始化 inline void Update(int x,int y) {for(register int i=1;i<SqrtN;++i) s[i][x%i]+=y-a[x];}//修改操作 inline double GetAns(int x,int y)//詢問操作 { register int i,p,ans=0;F.read(p);//將多餘的一個數讀入 if(y<SqrtN) return s[y][x%y];//如果小於Sqrtn,直接返回預處理得到的值 for(i=x%y;i<=n;i+=y) ans+=a[i];//暴力求解,且時間複雜度肯定不大於O(√n) return ans;//返回答案 } }S1; class Key2//處理t>1的情況,與暴力類似,但是要加上一個玄學的優化 { public: inline double GetAns(int x,int y,int z) { register int i,lim,Min=2e9,w;register double ans=0,mul=1; for(i=1;i<=x;++i) F.read(w),Min=min(Min,w);//可以保證,給k染上數目最少的顏色肯定是最優的 //暴力求解,注意將操作次數與60取min for(i=0,lim=min(min(Min,(n-y)/z),60);i<=lim;++i) ans+=mul*a[y+i*z],mul*=1.0*(Min-i)/(n-i-1); for(i=1,lim=min(min(Min,(y-1)/z),60),mul=1.0*Min/(n-1);i<=lim;++i) ans+=mul*a[y-i*z],mul*=1.0*(Min-i)/(n-i-1); return ans;//返回答案 } }S2; int main() { register int i,Q,op,x,y,z; for(F.read(n),F.read(Q),i=1;i<=n;++i) F.read(a[i]); for(S1.Init();Q;--Q) { F.read(op),F.read(x),F.read(y); if(op>>1) F.read(z),printf("%.6lf\n",x>1?S2.GetAns(x,y,z):S1.GetAns(y,z));//詢問操作,對t的大小進行分類討論 else S1.Update(x,y),a[x]=y;//修改操作 } return 0; }

T2T2:訪問計劃(點此看題面

這題的正解似乎是一個很複雜的樹形DPDP

LinkLink

但是,太複雜的動態規劃我寫不來,因此我用的是另外一種做法,雖然照樣要用樹形DPDP

不難想到,如果要從一個點到達另一個點,選擇的肯定是樹上最長鏈(即樹的直徑)的兩個端點。

於是,我們只要每次求出樹的直徑,更新答案,然後將這條直徑上所有邊的邊權全部改為原來的相反數即可。

至於為什麼要取相反數,這是因為每條邊必須經過一次,這樣一來如果再選一次這條邊,就會與原先的抵消,避免一條邊被選擇兩次。

有一個很重要的問題就是如何求樹的直徑

溫馨提示,千萬不能寫BFSBFS!!!否則下場就和我一樣… …

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define uint unsigned int
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define abs(x) ((x)<0?-(x):(x))
#define INF 1e9
#define Inc(x,y) ((x+=y)>=MOD&&(x-=MOD))
#define N 2000
#define LogN 15
#define add(x,y,z) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y,e[ee].val=z)
#define Dis(x,y) (dis[x]+dis[y]-dis[LCA(x,y)])
using namespace std;
int n,m,k,ee=0,lnk[N+5];
struct edge
{
    int to,nxt,val;
}e[2*N+5];
class FIO
{
    private:
        #define Fsize 100000
        #define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
        #define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,FoutSize,stdout),Fout[(FoutSize=0)++]=ch))
        int f,FoutSize,OutputTop;char ch,Fin[Fsize],*FinNow,*FinEnd,Fout[Fsize],OutputStack[Fsize];
    public:
        FIO() {FinNow=FinEnd=Fin;}
        inline bool read(int &x) {x=0;while(!isdigit(ch=tc())) if(!~ch) return false;while(x=(x<<3)+(x<<1)+(ch&15),isdigit(ch=tc())) if(!~ch) return false;return true;}
        inline void read_char(char &x) {while(isspace(x=tc()));}
        inline void read_string(string &x) {x="";while(isspace(ch=tc()));while(x+=ch,!isspace(ch=tc())) if(!~ch) return;}
        inline void write(int x) {if(!x) return (void)pc('0');if(x<0) pc('-'),x=-x;while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;}
        inline void write_char(char x) {pc(x);}
        inline void write_string(string x) {register int i,len=x.length();for(i=0;i<len;++i) 
            
           

相關推薦

2018.10.03 NOI+模擬 解題報告

得分: 30+5+0=3530+5+0=3530+5+0=35(考得真不咋滴) T1T1T1:奧義商店(點此看題面) 以為很簡單,對著這題想了一個多小時,最後果斷打了個暴力交了… … 看完題解發現其實

2018.10.6 NOIP模擬解題報告

報告 pan 期望 spa mat 分情況討論 。。 都是 數據 心路歷程 預計得分:\(100 + 100 + 20 = 220\) 實際得分:\(100 + 100 + 30 = 230\) 辣雞模擬賽。。 T1T2都是一眼題,T3考驗卡常數還只有一檔暴力分。 開場發現

2018.10.26 NOIP2018模擬 解題報告

得分: 0+10+100+10+100+10+10(T1T1T1死於假題面,T3T3T3死於細節… …) P.S.P.S.P.S.由於原題是圖片,所以我沒有上傳題目描述,只有資料。 T1T1T1:顏料

【比賽報告2018.10.19 NOIP模擬卷十九

比賽時間:2018.10.19 選手:lrllrl 用時:2.5h 得分:10+0+30=40 #include<cstdio> #include<cstring> #include<algorithm> using

2018.10.30 NOIp模擬 T1 改造二叉樹

【題目描述】       小Y在學樹論時看到了有關二叉樹的介紹:在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作“左孩子”和“右孩子”。二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。      什麼是二叉

2015-9-13 NOIP模擬解題報告(by hzwer)

++ ron 解題報告 正整數 max 決策 pty uri 由於 小奇挖礦 「題目背景」 小奇要開采一些礦物,它駕駛著一臺帶有鉆頭(初始能力值w)的飛船,按既定路線依次飛過喵星系的n個星球。 「問題描述」 星球分為2類:資源型和維修型。 1.資源型:含礦物質量a[i],若

2018.10.17 NOIP模擬

T1 刺客信條 分析 這道題當時做的時候想到了二分的做法,但是沒想出來怎麼二分。所以華麗的爆0了。 那麼我們考慮二分距離,把每個人抽象成一個圓(為什麼不是方形呢?方形的頂點到中心的距離和方形的邊上一點到照片中心的距離各不相同),這個圓的半徑r就是我們要二分的。

11.7NOIP模擬解題報告

心路歷程 預計得分:\(50 + 100 + 100\) 實際得分:\(50 + 100 +100\) T2 T3兩道資料結構題美滋滋,然而寫完就過去\(3h\)美滋滋 T1數學題學弟們都會做Orzzz 還是太菜了qwq Sol T1 設\(g = gcd(n, m, k)\),判斷給出的數在模\(g\)的意

11.6NOIP模擬解題報告

心路歷程 預計得分:\(100 + 100 + 100 = 300\) 實際得分:\(100 +100 +100 = 300\) 學OI兩年終於AK了一次qwq(雖然題目炒雞水。。) 紀念一下這令人激動的時刻。。 8點開始考,9:40就都拍上了。。可見題目確實水。。然後又去做了做另一套 Sol T1 題目中

11.5NOIP模擬解題報告

心路歷程 預計得分:\(100 + 40 + 30 = 170\) 實際得分:\(100 +100 + 50 = 250\) 辣雞資料毀我青春 T1一眼不會做感覺要涼 T2好像一波折半搜尋就做完了 T3好像是神仙題不會做。。 打完T1暴力後去淦T2,結果最後在排序的時候把greater<LL>()

NOI 2015 滯後解題報告

operator scrip emc void long 存在 truct append asc 報同步賽的時候出了些意外。於是僅僅能做一做“滯後賽”了2333 DAY1 T1離線+離散化搞,對於相等的部分直接並查集,不等部分查看是否在同一並查集中就

2018.12.17】NOI模擬4

題目 WZJ題解   T1 T2   T3 字尾自動機+($parents$ 樹)樹鏈剖分 發現有大量子串需要考慮,考慮摁死子串的一端。 首先,這題顯然是一道離線題,因為所有的詢問都是 $1$ 到 某個數,也就是一個字首和,完全可以遞推處理。 所以先把所有的詢問按 $m

歡樂解題報告

輸入 不同 eof ~~ ostream 同步 題目 由於 .cpp ~~一場不歡樂的歡樂賽 時間分配::T1做的時候還可以,大約三十分鐘寫了個深搜(鬼知道我為啥不用廣搜,大概是因為快半個月沒寫了)寫完後去研究第二題,剛開始以為是貪心,很快寫了出來,但是自己推了一會舉出了反

2014-10-5 NOIP模擬

str 隨機 一個人 保留 有根樹 tree noip 否則 數據規模 祖孫詢問 (tree.pas/c/cpp) 【問題描述】 已知一棵n個節點的有根樹。有m個詢問。每個詢問給出了一對節點的編號x和y,詢問x與y的祖孫關系。 【輸入格式】 輸入第

2017-10-13 NOIP模擬

color style http gen 9.png noi image push front 入陣曲 #include<iostream> #include<cstdio> #define

2017-10-18 NOIP模擬

click truct using res dfs freopen close amp max 紙牌遊戲 #include<iostream> #include<cstdio> #include<ctime

2017-10-24 NOIP模擬

b- 不一定 urn 要求 接下來 time -a -- 技術分享 括號序列 (bracket) Time Limit:1000ms Memory Limit:128MB 題目描述 LYK有一個括號序列,但這個序列不一定合法。 一個合法的括號序列如下:

2017-10-28 noip模擬by WISCO 信息組

卡常 有一個 struct 根節點 space pau 證明 class 數學 第一次做模擬賽,自我感覺良好(大概是這套題比較簡單) T1 名稱為“數據結構”,這也太坑了點……233 要維護一個數列(初始為零),支持區間加與查詢。 查詢的是一個區間中有多少數滿足min&

2017.10.28 QB模擬 ——上午

scanf find als put read splay std define pan 題目鏈接 T1 1e18 內的立方數有 1e6個 直接枚舉可過 二分最優 考場用set 死慢。。 #include <cstdio> int

2017.10.28 QB模擬 —— 下午

+= card closed 技術分享 oot long sum car one 題目鏈接 T1 按x值排序 遇到第二種牌插入 遇到第一種牌 查詢<=y 的最小值 刪除他 splay multiset cys大佬說 multiset就是不去重的se