zoukankan      html  css  js  c++  java
  • 2020hdu多校第八场比赛及补题

    1003 Clockwise or Counterclockwise

    给A B C三个点,这三个点都在一个以原点为圆心的圆上,问ABC方向是顺时针方向还是逆时针方向

    挺烦的模拟

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    // const int MAXN = ;
    // const int MOD = ;
    // const int INF = ;
    // const double eps = ;
    const double PI = acos(-1);
    // const int DIRX[] = {};
    // const int DIRY[] = {};
    
    struct Node
    {
        int x, y;
        double s;
        double c;
        double the;
    }node[5];
    
    int T;
    double r;
    
    int32_t main(void)
    {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cin >> T;
        while (T--)
        {
            for (int i = 1; i <= 3; ++i)
            {
                cin >> node[i].x >> node[i].y;
                r = sqrt((long long)node[1].x * node[1].x + (long long) node[1].y * node[1].y);
                node[i].s = (double) node[i].y / r;
                node[i].c = (double) node[i].x / r;
                node[i].the = asin(node[i].s);
                // cout << node[i].s << " " << node[i].c << " " << node[i].the << endl;
            }
            for (int i = 1; i <= 3; ++i)
            {
                if (node[i].s > 0 && node[i].c < 0)
                    node[i].the = PI - node[i].the;
                if (node[i].s <= 0 && node[i].c < 0)
                    node[i].the = PI - node[i].the;
                if (node[i].s < 0 && node[i].c > 0)
                    node[i].the += 2 * PI;
                // cout << (node[i].the / PI) << " ";
            }
            if (node[1].the > node[2].the)
            {
                if (node[3].the > node[1].the || node[3].the < node[2].the)
                {
                    cout << "Clockwise" << endl;
                }
                else
                {
                    cout << "Counterclockwise" << endl;
                }
            }
            else
            {
                if (node[3].the > node[2].the || node[3].the < node[1].the)
                {
                    cout << "Counterclockwise" << endl;
                }
                else
                {
                    cout << "Clockwise" << endl;
                }
            }
        }
        return 0;
    }
    

      

    1006 Fluctuation Limit

    问是否存在这样一个数列,li ai ri (1 i n)   and  | ai ai+1 | k (1 in1)

    若存在,输出这样的一个数列

    简单的线段合并模拟

    a1的范围是[l1,r1],那么a2的范围是被包含在[l1-k,ri+k]内的,那么a2的范围就是[l1-k,ri+k]和[l2,r2]的交集,这样再推出a3,a4...an的范围

    然后在an选一个数,再确定an-1,再确定an-2...从后往前确定数

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    const int MAXN = 1e5+7;
    struct LINE{
    	long long l,r;
    }line[MAXN];
    long long l, r;
    long long ans[MAXN];
    bool merge(LINE a,LINE b){
    	if(a.r<b.l||a.l>b.r) return false;
    	l = max(a.l,b.l);
    	r = min(a.r,b.r);
    	return true;
    }
    int main()
    {
    	int T;
    	int n;
    	long long k;
    	cin>>T;
    	while(T--){
    		cin>>n>>k;
    		for(int i = 1;i <= n;i++){
    			scanf("%lld%lld",&line[i].l,&line[i].r);
    		}
    		bool flag = true;
    		LINE pre, aft;
    		for(int i = 2;i <= n;i++){
    			pre.l = line[i-1].l-k;
    			pre.r = line[i-1].r+k;
    			if(merge(pre,line[i])){
    				line[i].l = l;
    				line[i].r = r;
    			}
    			else {
    				flag = false;
    				break;
    			}
    		}
    		if(!flag) cout<<"NO"<<endl;
    		else{
    			cout<<"YES"<<endl;
    			ans[n] = line[n].l;
    			for(int i = n - 1; i;i--){
    				aft.l = ans[i + 1]-k;
    				aft.r = ans[i + 1]+k;
    				merge(line[i],aft);
    				ans[i] = l;
    			}
    			for(int i = 1;i < n;i++) printf("%lld ",ans[i]);
    			printf("%lld
    ",ans[n]);
    		}
    	}
    	return 0;
    }
    

      

    1008 Hexagon

    阴间构造蜂巢题,感觉比第十场的扫雷恶心多了

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std; 
    void gon(int n){
    	if(n == 1) return;
    	if(n == 2) {
    		printf("543215");
    		return;
    	}
    	for(int i = 1;i <= n - 2;i++) printf("42");
    	printf("3");
    	for(int i = 1;i <= n - 2;i++) printf("53");
    	printf("4");
    	for(int i = 1;i <= n - 2;i++) printf("64");
    	printf("5");
    	for(int i = 1;i <= n - 2;i++) printf("15");
    	printf("6");
    	for(int i = 1;i <= n - 2;i++) printf("26");
    	printf("1");
    	for(int i = 1;i <= n - 3;i++) printf("31");
    	printf("2");
    	printf("43");
    	gon(n-2);
    }
    int main()
    {
    	int T, n;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);
    		gon(n);
    		printf("
    ");
    	}
    	return 0;
    }
    

      

    1009 Isomorphic Strings

    哈希

    加一个小剪枝:总串一共有x种字母,第一段子串有y种字母,x!=y就直接return false;

    第一次写双哈希,三哈希

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    using namespace std; 
    const int MAXN = 5e6+7;
    const int INF = 1e7;
    const int BASE = 29;
    const long long MOD1 = 99824435;
    const long long MOD2 = 1e9+7; 
    //const long long MOD3 = 1e9+9;
    char s[MAXN];
    int su[26];
    long long ten[3][MAXN];
    int n;
    int kind;
    void pre(int n){
    	ten[0][0] = ten[1][0] = ten[2][0] = 1;
    	for(int i = 1;i <= n;i++){
    		ten[0][i] = ten[0][i-1] * 10 % MOD1;
    		ten[1][i] = ten[1][i-1] * 10 % MOD2;
    		//ten[2][i] = ten[2][i-1] * 10 % MOD3;
    	}
    }
    int gcd(int a,int b){
    	if(a<b) swap(a,b);
    	while(b){
    		a = a % b;
    		swap(a,b);
    	}
    	return a;
    }
    bool check(int len){
    	vector<long long>hash_1,hash_2
    	//,hash_3
    	;
    	bool vis[26]={false};//这里一定要初始化,我这里wa了找了好久qwq
    	long long res1 = 0, res2 = 0
    	//,res3 = 0
    	;
    	int kd = 0;
    	for(int i = 1;i <= len;i++){
    		res1 = res1 * 10 + s[i] - 'a';
    		res2 = res2 * 10 + s[i] - 'a';
    		//res3 = res3 * 10 + s[i] - 'a';
    		res1 %= MOD1;
    		res2 %= MOD2;
    		//res3 %= MOD3;
    		if(!vis[s[i]-'a']){
    			kd++;
    			vis[s[i]-'a'] = true;
    		}
    	}
    	if(kd!=kind) return false;
    	hash_1.push_back(res1);
    	hash_2.push_back(res2);
    	//hash_3.push_back(res3);
    	for(int i = 1;i < len;i++){
    		res1 -= (long long)1 * (s[i] - 'a') * ten[0][len-1];
    		res1 = (res1 % MOD1 + MOD1) * 10 % MOD1;
    		res1 += s[i] - 'a';
    		res1 %= MOD1;
    		res2 -= (long long)1 * (s[i] - 'a') * ten[1][len-1];
    		res2 = (res2 % MOD2 + MOD2) * 10 % MOD2;
    		res2 += s[i] - 'a';
    		res2 %= MOD2;
    		//res3 -= (long long)1 * (s[i] - 'a') * ten[2][len-1];
    		//res3 = (res3 % MOD3 + MOD3) * 10 % MOD3;
    		//res3 += s[i] - 'a';
    		//res3 %= MOD3;
    		hash_1.push_back(res1);
    		hash_2.push_back(res2);
    		//hash_3.push_back(res3); 
    	}	 
    	for(int pos = 1;pos < n / len;pos++){
    		bool flag = false;
    		res1 = 0;res2 = 0;
    		//res3 = 0;
    		int st = pos * len;
    		for(int i = 1;i<=len;i++){
    			res1 = res1 * 10 + s[st + i] - 'a';
    			res1 %= MOD1;
    			res2 = res2 * 10 + s[st + i] - 'a';
    			res2 %= MOD2; 
    			//res3 = res3 * 10 + s[st + i] - 'a';
    			//res3 %= MOD3; 
    		}
    		for(int i = 0;i < hash_1.size();i++){
    			if(hash_1[i]==res1&&hash_2[i]==res2
    			//&&hash_3[i]==res3
    			)
    			 {
    				flag = true;
    				break;
    			}
    		}
    		if(!flag) return false;
    	}
    	return true;
    }
    int main()
    {
    	pre(5e6);
    	int T;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);
    		getchar();
    		kind = 0;
    		for(int i = 0;i < 26;i++) su[i] = 0;
    		for(int i = 1;i <= n;i++){
    			scanf("%c",&s[i]);
    			su[s[i]-'a']++;
    		} 
    		int gg;
    		int first;
    		int mi = INF;
    		for(int i = 0;i < 26;i++) 
    			if(su[i]) {
    				kind++;
    				mi = min(mi,su[i]);
    			}	
    		for(int i = 0;i < 26;i++){
    			if(su[i]) {
    				gg = su[i];
    				first = i;
    				break;
    			}
    		}
    		for(int i = first + 1;i < 26;i++){
    			if(su[i]) gg = gcd(gg,su[i]);
    		}
    		bool flag = false;
    		for(int k = 2;k <= gg;k ++){
    			if(n%k) continue;
    			int len = n / k;
    			if(check(len)) {
    				flag = true;
    				break;
    			}
    		}
    		if(flag) cout<<"Yes"<<endl;
    		else cout<<"No"<<endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    C++ 编译时字符串加密
    c#自动修复缺损和不规范的html
    C#下载网络资源(网页或文件)
    yum install 命令下载安装离线包
    C# Sql Server 数据库 传递 表值参数
    cximage 裁剪图片并背景透明
    centos 7.5 编译并运行 opencv 4.5.1 c++
    c++ freeimage 指定颜色透明
    c++ string 大小写转换
    opencv 裁剪图像
  • 原文地址:https://www.cnblogs.com/ruanbaitql/p/13573104.html
Copyright © 2011-2022 走看看