• Codeforces Round #628 (Div. 2) 题解


    草了,差点掉分

    A:求一组合法的 (a,b),使得 (gcd(a,b)+lcm(a,b)=n)

    最开始看错题愣了1min,大草

    a=1,b=n-1 即可

    B:给你(n)个元素,复制(n)遍,输出最长严格上升子序列的长度。

    去重即可,你可以在每遍复制的时候只取一个,但是要求严格上升,即去重。

    C:使得 (max{mex(u,v)}) 的值最小。

    再次读错题wa一发

    我们考虑,链上都是一样的。

    然后链的点最多度数为2,然后我们发现如果度数为3,我们就在这个点扩展开来,0和1放两边,就可以了。

    D:构造一个最短的序列,使得和为 (u) , 异或和为 (v)

    特判掉一堆就好了吧/dk

    signed main() {
      // code begin.
    	int u , v;
    	in >> u >> v;
    	if(u > v) {
    		out << -1 << '
    ' ;
    		return 0 ;
    	}
    	else {
    		if(u == v && ! u && ! v) {
    			out << 0 << '
    ' ;
    			return 0 ;
    		}
    		else {
    			if(u == v) {
    				out << 1 << '
    ' ;
    				out << u << '
    ' ;
    				return 0 ;
    			}
    			else {
    				int left = v - u ;
    				if(left & 1) {
    					out << -1 << '
    ' ;
    					return 0 ;
    				}
    				else {
    					left >>= 1;
    					if(u & left) {
    						out << 3 << '
    ' ;
    						out << u << ' ' << left << ' ' << left << '
    ' ;
    						return 0 ;
    					}
    					else {
    						out << 2 << '
    ' ;
    						out << (u | left) << ' ' << left << '
    ';
    						return 0 ;
    					}
    				}
    			}
    		}
    	}
    	return 0;
      // code end.
    }
    

    E:给你一个序列,你需要选择一个子序列,题目保证每个元素最多有两个质因子,使得这个子序列的乘积是完全平方数,并使得长度最短。
    质因子之间连边,如果只有一个质因子,就连到0。
    然后我们求一下最小环,就是记录先后到达 i 的两个点,然后就可以了。

    // powered by c++11
    // by Isaunoya
    #include <bits/stdc++.h>
    #define rep(i, x, y) for (register int i = (x); i <= (y); ++i)
    #define Rep(i, x, y) for (register int i = (x); i >= (y); --i)
    using namespace std;
    using db = double;
    using ll = long long;
    using uint = unsigned int;
    #define Tp template
    using pii = pair<int, int>;
    #define fir first
    #define sec second
    Tp<class T> void cmax(T& x, const T& y) {
      if (x < y) x = y;
    }
    Tp<class T> void cmin(T& x, const T& y) {
      if (x > y) x = y;
    }
    #define all(v) v.begin(), v.end()
    #define sz(v) ((int)v.size())
    #define pb emplace_back
    Tp<class T> void sort(vector<T>& v) { sort(all(v)); }
    Tp<class T> void reverse(vector<T>& v) { reverse(all(v)); }
    Tp<class T> void unique(vector<T>& v) { sort(all(v)), v.erase(unique(all(v)), v.end()); }
    const int SZ = 1 << 23 | 233;
    struct FILEIN {
      char qwq[SZ], *S = qwq, *T = qwq, ch;
    #ifdef __WIN64
    #define GETC getchar
    #else
      char GETC() { return (S == T) && (T = (S = qwq) + fread(qwq, 1, SZ, stdin), S == T) ? EOF : *S++; }
    #endif
      FILEIN& operator>>(char& c) {
        while (isspace(c = GETC()))
          ;
        return *this;
      }
      FILEIN& operator>>(string& s) {
        while (isspace(ch = GETC()))
          ;
        s = ch;
        while (!isspace(ch = GETC())) s += ch;
        return *this;
      }
      Tp<class T> void read(T& x) {
        bool sign = 0;
        while ((ch = GETC()) < 48) sign ^= (ch == 45);
        x = (ch ^ 48);
        while ((ch = GETC()) > 47) x = (x << 1) + (x << 3) + (ch ^ 48);
        x = sign ? -x : x;
      }
      FILEIN& operator>>(int& x) { return read(x), *this; }
      FILEIN& operator>>(ll& x) { return read(x), *this; }
    } in;
    struct FILEOUT {
      const static int LIMIT = 1 << 22;
      char quq[SZ], ST[233];
      int sz, O;
      ~FILEOUT() { flush(); }
      void flush() {
        fwrite(quq, 1, O, stdout);
        fflush(stdout);
        O = 0;
      }
      FILEOUT& operator<<(char c) { return quq[O++] = c, *this; }
      FILEOUT& operator<<(string str) {
        if (O > LIMIT) flush();
        for (char c : str) quq[O++] = c;
        return *this;
      }
      Tp<class T> void write(T x) {
        if (O > LIMIT) flush();
        if (x < 0) {
          quq[O++] = 45;
          x = -x;
        }
        do {
          ST[++sz] = x % 10 ^ 48;
          x /= 10;
        } while (x);
        while (sz) quq[O++] = ST[sz--];
      }
      FILEOUT& operator<<(int x) { return write(x), *this; }
      FILEOUT& operator<<(ll x) { return write(x), *this; }
    } out;
    //#define int long long
    
    const int maxv = 1e3 ;
    const int maxn = 1e6 ;
    int isprime[maxv + 1];
    vector<int> prime;
    vector<int> g[maxn];
    int d1[maxn], d2[maxn];
    int f1[maxn], f2[maxn];
    
    signed main() {
      // code begin.
      for (int i = 2; i <= maxv; i++) {
        if (!isprime[i]) {
          prime.pb(i);
          isprime[i] = sz(prime);
          for (int j = 2 * i; j <= maxv; j += i) isprime[j] = -1;
        }
      }
      int n;
      in >> n;
      int ans = n + 1;
      for (int i = 0; i < n; i++) {
        int x;
        in >> x;
        vector<int> d;
        for (int p : prime) {
          int cnt = 0;
          while (!(x % p)) x /= p, ++cnt;
          if (cnt & 1) d.pb(isprime[p]);
        }
        if (x == 1) {
          if (d.empty()) {
            out << 1 << '
    ';
            return 0;
          } else if (sz(d) == 1) {
            g[d[0]].pb(0), g[0].pb(d[0]);
    			}
          else {
            g[d[0]].pb(d[1]), g[d[1]].pb(d[0]);
    			}
        } else if (d.empty()) {
          g[0].pb(x), g[x].pb(0);
    		}
        else {
          g[d[0]].pb(x), g[x].pb(d[0]);
    		}
      }
      for (int i = 0; i < 169; i++) {
        fill(d1, d1 + maxn, -1);
        fill(d2, d2 + maxn, -1);
        sort(g[i].begin() , g[i].end()) ;
        if (unique(g[i].begin() , g[i].end()) != g[i].end()) {
          out << 2 << '
    ';
          return 0;
        }
        queue<int> q1, q2, q3;
        for (int v : g[i]) q1.push(v), q2.push(1), q3.push(v);
        while (!q1.empty()) {
          int u = q1.front(), d = q2.front(), f = q3.front();
          q1.pop(), q2.pop(), q3.pop();
          if (d1[u] == -1) {
            d1[u] = d, f1[u] = f;
          } else if (d2[u] == -1 && f1[u] ^ f) {
            d2[u] = d, f2[u] = f;
          } else {
            continue;
    			}
          for (int v : g[u])
            if (v ^ i)
              q1.push(v), q2.push(d + 1), q3.push(f);
        }
        for (int v : g[i])
          if (~d2[v]) cmin(ans, d2[v] + 1);
      }
      if (ans > n) out << -1 << '
    ';
      else out << ans << '
    ';
      return 0;
      // code end.
    }
    

    F:

    随便找一颗生成树,然后在上面遍历,如果有一个边相邻的两个点是相距sqrt的就可以直接输出2了。
    否则我们01染色,最后输出一个合法的方案,这样就可以了/kk

    #include<bits/stdc++.h>
    using namespace std ;
    int n , m ;
    const int maxn = 1e6 + 61 ;
    vector < int > g[maxn] ;
    int dep[maxn] , col[maxn] , fa[maxn] , vis[maxn] , ans[maxn] ;
    int sq ;
    
    void dfs(int u) {
    	bool qwq = 1 ;
    	for(int v : g[u]) {
    		if(! dep[v]) {
    			col[v] = col[u] ^ 1 ;
    			fa[v] = u ;
    			dep[v] = dep[u] + 1 ;
    			dfs(v) ;
    		}
    		else {
    			if(dep[u] < dep[v] && vis[v]) {
    				qwq = 0 ;
    			}
    			if(dep[u] - dep[v] + 1 >= sq) {
    				cout << 2 << '
    ' ;
    				cout << dep[u] - dep[v] + 1 << '
    ' ;
    				int now = u ;
    				while(now ^ v) {
    					cout << now << ' ' ;
    					now = fa[now] ;
    				}
    				cout << now << '
    ' ;
    				exit(0) ;
    			}
    		}
    	}
    	vis[u] = qwq ;
    	ans[col[u]] += qwq ;
    }
    
    
    void print(int c) {
    	cout << 1 << '
    ' ;
    	for(int i = 1 ; i <= n ; i ++) 
    		if(col[i] == c && sq && vis[i])
    			cout << i << ' ' , sq -- ;
    	exit(0) ;
    }
    
    int main() {
    	ios :: sync_with_stdio(false) ;
    	cin.tie(nullptr) , cout.tie(nullptr) ;
    	cin >> n >> m ;
    	sq = sqrt(n) ;
    	if(sq * sq != n) ++ sq ;
    	while(m --) {
    		int u , v ;
    		cin >> u >> v ;
    		g[u].push_back(v);
    		g[v].push_back(u) ;
    	}
    	dfs(dep[1] = 1) ;
    	if(ans[0] >= sq) {
    		print(0) ;
    	}
    	else {
    		print(1) ;
    	}
    	return 0 ;
    }
    
  • 相关阅读:
    201771010126 王燕《面向对象程序设计(Java)》第十二周学习总结
    201771010126 王燕《面向对象程序设计(java)》第十一周学习总结
    201771010126 王燕《面向对象程序设计(Java)》第十周学习总结
    201771010126 王燕《面向对象程序设计(Java)》第九周学习总结
    201771010126 王燕《面向对象程序设计(java)》第八周学习总结
    201771010126 王燕《面向对象程序设计(Java)》第七周实验总结
    201771010126.王燕《面向对象程序设计(Java)》第六周学习总结
    201771010126王燕《面向对象程序设计(Java)》第三周学习总结
    201771010126 王燕《面向对象程序设计(java)》第二周学习总结
    201771010134杨其菊《面向对象程序设计java》第十二周学习总结
  • 原文地址:https://www.cnblogs.com/Isaunoya/p/12505758.html
Copyright © 2020-2023  润新知