Description
OI小园丁ZZX最近在XJOI上夜以继日地学习编程基础知识,刷初级训练题库。在无压力AC了“圆的周长与面积”、“二位数加法口算训练程序”等题之后,他遇到了这样一道难题:
“输入n个数a[1], a[2], ..., a[n],请将它们升序排序后输出。”
ZZX苦思冥想,不知所措,便去请教德高望重的OI老司机JRY。
JRY贴给他一段超自然的神秘代码,说:
“你把这段东西塞进程序里,然后每次调用magic(left, right)这个函数,它就会用O(1)时间将a[left], a[left+1], ..., a[right]原地升序排序。”
“劲啊”
“但是啊由于一些奇怪的原因,你不能直接调用magic(1,n),否则程序会RE”
“wori?”
不过这难不倒聪明伶俐的ZZX。经过一番思索,他写出了这样一段程序:
input(a[1], a[2], ..., a[n]);
magic(left_1, right_1);
magic(left_2, right_2);
...
magic(left_m, right_m);
output(a[1], a[2], ..., a[n]);
JRY看了这段代码,批判道:“Native! 看我用遗传算法造个数据分分钟把你卡掉”
然而ZZX并不信服,他打算把程序交到XJOI上,用评测结果来打JRY的脸。
由于XJOI管理员Ginger最近忙于打Geometry Dash,没有工夫来修理狗带了的评测姬。因此评测任务落到了你的头上。
这道题共有q个测试点。你需要对于每一个测试点,判断ZZX的程序是否输出了正确的排序结果。
Input
第一行三个整数n, m, q。
接下来m行按顺序给出了ZZX的程序中每条指令的参数left_i, right_i。
接下来q行,每行表示一个测试点,包含空格隔开的n个非负整数a[1], a[2], ..., a[n]。
1 ≤ n ≤ 1500 , 1 ≤ m ≤ 1000000 , 1 ≤ q ≤ 1500;
1 ≤ left_i ≤ right_i ≤ n, right_i - left_i + 1 < n; 0 ≤ a[i] ≤ 1500。
Output
对于每个测试点输出一行,如果ZZX的程序能将这个数列正确排序,输出"AC",否则输出"WA"。
Sample Input
6 3 2
1 3
3 6
1 3
4 2 2 3 0 7
5 3 8 2 1 9
1 3
3 6
1 3
4 2 2 3 0 7
5 3 8 2 1 9
Sample Output
AC
WA
样例说明
对于第一个测试点:
4 2 2 3 0 7 -> [2 2 4] 3 0 7 -> 2 2 [0 3 4 7] -> [0 2 2] 3 4 7,正确。
对于第二个测试点:
5 3 8 2 1 9 -> [3 5 8] 2 1 9 -> 3 5 [1 2 8 9] -> [1 3 5] 2 8 9,错误。
WA
样例说明
对于第一个测试点:
4 2 2 3 0 7 -> [2 2 4] 3 0 7 -> 2 2 [0 3 4 7] -> [0 2 2] 3 4 7,正确。
对于第二个测试点:
5 3 8 2 1 9 -> [3 5 8] 2 1 9 -> 3 5 [1 2 8 9] -> [1 3 5] 2 8 9,错误。
策爷的论文题啊……
题解在这儿
我只想知道为啥这题的弱化版会出现在我们的NOIP模拟赛里
1 //minamoto 2 #include<bits/stdc++.h> 3 #define rint register int 4 #define min(x,y) ((x)<(y)?(x):(y)) 5 #define ls (p<<1) 6 #define rs (p<<1|1) 7 #define ppd(p,v) (mn[p]+=(v),tag[p]+=(v)) 8 #define mem(a) (memset(a,0,sizeof(a))) 9 using namespace std; 10 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 11 char buf[1<<21],*p1=buf,*p2=buf; 12 int read(){ 13 int res,f=1;char ch; 14 while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1); 15 for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0'); 16 return res; 17 } 18 const int N=2005,M=1e6+5; 19 int n,m,q,c[N],posc[N],b[N],posb[N],mn[N<<2],tag[N<<2]; 20 struct ques{int l,r;}p[M];set<int>s; 21 struct node{ 22 int val,id; 23 inline bool operator <(const node &b)const{return val==b.val?id<b.id:val<b.val;} 24 }f[N]; 25 void SORT(rint l,rint r){ 26 rint i; 27 while((i=*s.upper_bound(l-1))>=l&&i<r){ 28 s.erase(i),swap(c[i],c[i+1]); 29 if(c[i+1]<c[i+2]&&c[i]>c[i+2])s.insert(i+1); 30 if(c[i-1]<c[i]&&c[i-1]>c[i+1])s.insert(i-1); 31 } 32 } 33 inline void pd(int p){if(tag[p])ppd(ls,tag[p]),ppd(rs,tag[p]),tag[p]=0;} 34 void update(int p,int l,int r,int ql,int qr,int v){ 35 if(ql<=l&&qr>=r)return (void)(ppd(p,v)); 36 int mid=(l+r)>>1;pd(p); 37 if(ql<=mid)update(ls,l,mid,ql,qr,v); 38 if(qr>mid)update(rs,mid+1,r,ql,qr,v); 39 mn[p]=min(mn[ls],mn[rs]); 40 } 41 int main(){ 42 // freopen("testdata.in","r",stdin); 43 n=read(),m=read(),q=read(); 44 for(int i=1;i<=m;p[i].l=read(),p[i].r=read(),++i); 45 for(int i=1;i<=n;c[i]=i,++i); 46 for(int i=1;i<n;s.insert(i),++i); 47 for(int i=m;i;SORT(p[i].l,p[i].r),--i); 48 for(int i=1;i<=n;posc[c[i]]=i,++i); 49 while(q--){ 50 for(int i=1;i<=n;f[i].val=read(),f[i].id=i,++i); 51 sort(f+1,f+1+n); 52 for(int i=1;i<=n;b[f[i].id]=i,++i); 53 for(int i=1;i<=n;posb[b[i]]=i,++i); 54 mem(mn),mem(tag); 55 bool flag=1; 56 for(int i=2;i<=n;++i){ 57 update(1,1,n,posb[i-1],n,1); 58 update(1,1,n,posc[i-1],n,-1); 59 if(mn[1]<0){flag=0;break;} 60 } 61 puts(flag?"AC":"WA"); 62 } 63 return 0; 64 }