http://codeforces.com/contest/1180/problems
B. Nick and Array
题意:给出一个n位序列 存在一个变换 使得 an变为 -an-1 求经过若干变换后 序列的乘积最大
这道水题卡了半天实在不应该 主要卡在 0 和-1 分了很多类
其实可以先默认全部变为负数 如果此时个数为偶数 那么就是最大值
如果为奇数:将最小的负数变为正数即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=1e5+10; int n,m; struct node { int v,pos; }s[N]; bool cmp(node a,node b) { return a.v<b.v; } bool cmp2(node a,node b) { return a.pos<b.pos; } int main() { RI(n); rep(i,1,n) { int x;RI(x);if(x>=0)x=-x-1; s[i].v=x;s[i].pos=i; } if(n%2==0) { rep(i,1,n) printf("%d ",s[i].v); } else { sort(s+1,s+1+n,cmp); s[1].v=-s[1].v-1; sort(s+1,s+1+n,cmp2); rep(i,1,n) printf("%d ",s[i].v); } return 0; }
C. Valeriy and Deque
题意:给出n个数的序列 m个询问
将该序列看作双端队列 每次从头取出两个数 A B 大的在前 小的在后
问第 k 次取出的是哪两个数
一开始还模拟了一下找循环节 。。。 浪费了一些时间
其实 当最大的在头就已经结束了 循环节为n-1 然后模拟一下就可以了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=3e5+10; int n,m,x,maxx,ans[N][2],A,B,cnt; deque<int>q; ll qe[N]; int main() { RII(n,m); int T=n-1; rep(i,1,n) { RI(x); q.push_back(x); maxx=max(maxx,x); } cnt=0; while(1) { ++cnt; A=q.front();q.pop_front(); B=q.front();q.pop_front(); ans[cnt][0]=A,ans[cnt][1]=B; if(A>B) q.push_front(A),q.push_back(B); else q.push_back(A),q.push_front(B); if(q.front()==maxx){break;} } int cnt2=cnt; rep(i,1,T) { ++cnt2; A=q.front();q.pop_front(); B=q.front();q.pop_front(); ans[cnt2][0]=A,ans[cnt2][1]=B; if(A>B) q.push_front(A),q.push_back(B); else q.push_back(A),q.push_front(B); } rep(i,1,m) { scanf("%lld",&qe[i]); if(qe[i]<=cnt2)printf("%d %d ",ans[qe[i]][0],ans[qe[i]][1]); else { qe[i]=(qe[i]-cnt)%T; if(!qe[i])qe[i]=T; printf("%d %d ",ans[ qe[i]+cnt ][0],ans[qe[i]+cnt][1]); } } return 0; }
D. Tolik and His Uncle
题意:给出一个n*m的矩阵 一开始在1 1 求一种方法遍历所有的格子 要求任意一步的行走向量不能相同 如果走不完 输出-1
显然 一边从1 1 一边从n m 交替走蛇形就是答案
注意 格子的奇偶情况
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=3e5+10; int n,m; int main() { RII(n,m); int x=1,y=1,d1=1,x2=n,y2=m,d2=-1; if(n==1&&m==1){printf("1 1");return 0;} int X=n+1,Y=m+1; ll cnt=n*m; ll temp=cnt/2; while( temp--) { printf("%d %d ",x,y); printf("%d %d ",X-x,Y-y); y+=d1; if(y==m+1) { y=m;d1=-d1;x++; } if(y==0) { y=1;d1=-d1;x++; } } if(cnt%2==1) printf("%d %d",x,y); return 0; }
这题的输出量 达到1000^2 经过测试 c 比c++ 快 (当然 c++关闭了流)
<<endl <<' ' 前者超时 后者不超时
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define see(x) (cerr<<(#x)<<'='<<(x)<<endl) #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=3e5+10; int n,m; int main() { RII(n,m); int x=1,y=1,d1=1,x2=n,y2=m,d2=-1; if(n==1&&m==1){printf("1 1");return 0;} int X=n+1,Y=m+1; ll cnt=n*m; ll temp=cnt/2; while( temp--) { printf("%d %d ",x,y); printf("%d %d ",X-x,Y-y); y+=d1; if(y==m+1) { y=m;d1=-d1;x++; } if(y==0) { y=1;d1=-d1;x++; } } if(cnt%2==1) printf("%d %d",x,y); return 0; }
最终rank 270 虽然打的很臭 但居然是历史最好成绩了QAQ