2022.07.07 暑假集训 个人排位赛

Posted 晁棠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022.07.07 暑假集训 个人排位赛相关的知识,希望对你有一定的参考价值。

2022.07.07 暑假集训 个人排位赛(二)

赛后反省

做出的题目多了,但是排名还是那样。对于题目的特殊样例情况没有完全顾及到,所以有一题错了很多发,有一题一直做不对,就卡一个点,后面心态爆炸不想做了。继续加油,过题状态比昨天好很多。

Problem A

出处

Codeforces-707B

题解

建图,以每个面粉店看与其相连的能够开设面包店的城市的边的最小值是多少。

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

const int N=1e5+5;
int n, T = 1, m, k;
int pi,p[N],nxt[N*2],to[N*2],cost[N*2];
int a[N],ans=inf;
bool f[N];

void add_in(int u,int v,int c)
    pi++;nxt[pi]=p[u];p[u]=pi;to[pi]=v;cost[pi]=c;


void ready()

    cin>>n>>m>>k;
    ffor(i,1,m)
        int u,v,c;
        cin>>u>>v>>c;
        add_in(u,v,c);
        add_in(v,u,c);
    
    ffor(i,1,k)
        cin>>a[i];
        f[a[i]]=true;
    
    ffor(i,1,k)
        int u=a[i];
        for(int k=p[u];k;k=nxt[k])
            int v=to[k];
            if(!f[v])
                ans=min(ans,cost[k]);
            
        
    
    if(ans==inf) ans=-1;
    cout<<ans;



void work()




signed main()

	IOS;
    ready();
	//	cin>>T;
	while (T--) 
		work();
	
	return 0;






Problem B

出处

Codeforces-707C

题解

对于勾股数 ( a , b , c ) (a,b,c) (a,b,c),可以有以下等式成立

a = x 2 − y 2 , b = 2 ∗ x ∗ y , c = x 2 + y 2 a=x^2-y^2,b=2*x*y,c=x^2+y^2 a=x2y2,b=2xy,c=x2+y2

其中 x , y x,y x,y为正整数。那么当已知一个数的时候,且这个数是偶数,假设这个数是b,则很容易得到x 和 y,从而得到a 和 b。当这个数是奇数的时候,另外两个数分别为 n 2 / 2 和 ( n 2 + 1 ) / 2 n^2/2和(n^2+1)/2 n2/2(n2+1)/2

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

int n, T = 1;
int gcd(int x,int y)
    return x%y==0?y:gcd(y,x%y);


bool check_(int a,int b,int c)
    if(a+b<=c || b+c<=a || a+c<=b) return false;
    if(a*a+b*b!=c*c) return false;
    return true;


void ready()

    cin>>n;
    if(n==1 || n==2)
        cout<<-1;
        return;
    
    if(n%2==0)
        int b=n;
        int x=1,y=b/2;
        int a=y*y-1,c=y*y+1;
        cout<<a<<' '<<c;
        return ;
    
    n=n*n;
    cout<<n/2<<' '<<(n+1)/2;



void work()




signed main()

	IOS;
    ready();
	//	cin>>T;
	while (T--) 
		work();
	
	return 0;






Problem C

出处

Codeforces-707D

题解(楊)

c题,建图,树dfs。
我们先忽略操作4,前三个如何快速在线操作和询问答案。
定义tag[i] 表示第i行是否被翻转
sum[i] 表示第i行真实值为1的数量
res 表示整张图1的数量
mp[i][j] 表示坐标(i,j)是1还是0 ,注意对于坐标(i,j)的值,
它的真实值为mp[i][j]^tag[i]

操作1,2:
修改mp[i][j],sum[i],res
注意:如果原来就是坐标(i,j)值是1,再去改成1是无意义的

操作3:
tag[i] ^= 1;
res -= sum[i];
res += m - sum[i];
sum[i] = m - sum[i];

这些都是可以O(1)维护的。
现在我们考虑操作4,因为4设计到回退版本。
我们将所有操作看作一个点,若第i步操作回退到第k步,那么把k连向i,
这样我们可以得到一棵树,只需要dfs一下树就可以得到每个时间戳对应的答案了。
回退操作体现到dfs上就是回溯操作。
树上每个结点最多经过两次,时间复杂度O(2n)

代码


// Good Good Study, Day Day AC.
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <map>
#include <algorithm> 
#include <unordered_map>
#include <unordered_set>
#define ffor(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define rrep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>
#define int long long

using namespace std;

const int N = 1e3 + 5, Q = 1e5 + 5;

int n, m, T = 1, ques;
int res, sum[N], mp[N][N], tag[N];
int p[Q], nxt[Q], to[Q], pi, ans[Q];
struct Oper 
	int op, x, y;
q[Q];

void add_in(int u, int v) 
	pi++; nxt[pi] = p[u]; p[u] = pi; to[pi] = v;


void dfs(int u, int fa) 
	int op = q[u].op, x = q[u].x, y = q[u].y;
	bool op1 = false, op2 = false;
	if (op == 1) 
		if ((!tag[x] && !mp[x][y]) || (tag[x] && mp[x][y])) 
			sum[x]++;
			res++;
			mp[x][y] ^= 1;
			op1 = true;
		
	
	else if (op == 2) 
		if ((!tag[x] && mp[x][y]) || (tag[x] && !mp[x][y])) 
			sum[x]--;
			res--;
			mp[x][y] ^= 1;
			op2 = true;
		
	
	else if (op == 3) 
		tag[x] ^= 1;
		res -= sum[x];
		sum[x] = m - sum[x];
		res += sum[x];
	

	ans[u] = res;
	for (int k = p[u]; k; k = nxt[k]) 
		int v = to[k];
		if (v != fa) 
			dfs(v, u);
		
	

	if (op == 1 && op1) 
		if ((!tag[x] && mp[x][y]) || (tag[x] && !mp[x][y])) 
			sum[x]--;
			res--;
			mp[x][y] ^= 1;
		
	
	else if (op == 2 && op2) 
		if ((!tag[x] && !mp[x]2022.07.07 暑假集训 个人排位赛

2022.07.07 暑假集训 个人排位赛

2022.07.15 暑假集训 个人排位赛

2022.07.13 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛

2022.07.14 暑假集训 个人排位赛