Codeforces Round #618 (Div. 2)
C
给你序列要求你排序这个序列使得满足((a1|a2-a2)|a3-a3)|a4-a4....的值最大
我们先枚举一下最基本的
x y ans
1 1 0
1 0 1
0 1 0
0 0 0
我们令以上表格为自定义符号¥,也就是a1|a2-a2=a1$a2;
发现只有1 0 才可以得出1,故我们就知道按位置贪心,从左边枚举到右边若有一个位置是只有一个1的,直接将这个值放在序列第一个位置
while(cin>>n) { vector < vector<int> > vc(32,vector<int>()) ; for(int i=1; i<=n; i++) { cin>>a[i]; int x = a[i], pos = 0 ; while(x) { if(x%2) vc[pos].pb(i); x/=2; pos++; } } int ans = -1 ; for(int i=vc.size()-1; i>=0; i--) if(vc[i].size()==1) { ans = vc[i][0]; break; } if(ans!=-1) swap(a[ans],a[1]); for(int i=1; i<=n; i++) cout<<a[i]<<" "; cout<<endl; } return 0 ; }
D
给定一个由 nnn 个点组成的严格(不存在三点共线)凸多边形。
你要将这个图形平移 nnn 次,每次将一个顶点与原点 (0,0)(0,0)(0,0) 重合。
请判断这 nnn 个平移后的多边形除了与原点重合的点之外的点组成的多边形是否与原图形相似。
在读入中,保证输入的点按逆时针顺序排列,形成严格凸多边形。
不会证明但是赛后用第六感和枚举一些简单凸包来找规律,
这个T和P相似,那我们将这个T的对角连线等于原图像p连线,如下图1和2那里
也就是每个对角联系起来,且发现因为都是围着(0,0)点,所以对角连线都是经过0,0点,故原型p必定是中心对称;
#include<cstdio> using namespace std; double x[100005],y[100005]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } if(n%2==1) { printf("NO\n"); return 0; } double p1=(x[1]+x[n/2+1])/2,p2=(y[1]+y[n/2+1])/2; for(int i=2;i<=n/2;i++) { double p3=(x[i]+x[n/2+i])/2; double p4=(y[i]+y[n/2+i])/2; if(p3!=p1||p4!=p2) { printf("NO\n"); return 0; } } printf("YES\n"); return 0; }