19-10-24-J-快乐?

向未来的大家发送祝福(不接受的请自动忽略):

祝大家程序员节快乐!

好了。

ZJ一下

额。

考场上差点死了。

码1h后,T1还没过大样例。

我×××。

后来发现是自己××了。

T2T3丢暴力。

比咕的分多一点点。

Finally:

29
Miemeng 100
03:09:04
25
03:09:04
25
03:09:05
150
03:09:05

Sol:

T1

不多说直接干即可

#include <iostream>
#include <cstring>
#include <cstdio>
#define L 1111111

using namespace std;

char st[L],ans[L<<4];
int len,cnt;
bool ndp[L<<4];
inline void addin(const char ch){ans[cnt++]=ch;}
int main(){
//	freopen("expression.in" ,"r",stdin);\
	freopen("expression.out","w",stdout);
	scanf("%s",st);
	len=strlen(st);
	cnt=0;
	for(int i=0;i<len;){
		if(st[i]=='-'){
			addin(st[i]);
			i++;
			addin(st[i]);
			i++;
			if(i>=len||st[i]=='+'||st[i]=='-')continue;
			addin('+');
			while(i<len&&st[i]!='+'&&st[i]!='-'){
				addin(st[i]);
				i++;
			}
		}
		else{
			addin(st[i]);
			i++;
		}
	}
//	cout<<cnt<<endl;
	for(int i=0;i<cnt;i++){
		if(ans[i]=='-'||ans[i]=='+'){
//			cout<<i<<">"<<endl;
			int j=i+2;
			if(ans[i+1]=='0'){
				while(j<cnt&&ans[j]=='0'){//SB
//					cout<<j<<endl;
					ndp[j]=1;
					j++;
				}
				if(ans[j]!='+'&&ans[j]!='-')ndp[j]=1;
				i=j-1;
			}
		}
	}
//	printf("%s\n",ans);\
	for(int i=0;i<cnt;i++)\
		if(ndp[i])\
			putchar('+');\
		else \
			putchar(' ');\
	puts("");
	for(int i=0;i<cnt;i++){
		if(ndp[i]&&ans[i]!='+'&&ans[i]!='-')printf("+");
		printf("%c",ans[i]);
	}
	puts("");
//	printf("%s\n",ans);
}

T2

考场上啥都没想出来。

首先如果一条边在一个偶环里就一定无法贡献答案。

第二如果一条边在一个奇环里,可能贡献答案,但是如果在这条边被选后还有另外的奇环,那也无法贡献答案。

于是建一棵搜索树,利用一种类似差分前缀和的思想维护$u \rightarrow fa$这条边所在的奇环偶环数。

(为什么有不快乐联通的图啊)

#include <iostream>
#include <cstring>
#include <cstdio>
#define N 111111                    
#define M 222222

using namespace std;

struct SR{
	int f,t,next;
}rs[2*M];
int fl[N],cnt=0;
int pn,edn,ans,
	dep[N],
	odd[N],
	even[N],
	odcnt=0;
bool is_v[N],
	 is_st[N];

void add(int f,int t){
	rs[cnt].f=f;
	rs[cnt].t=t;
	rs[cnt].next=fl[f];
	fl[f]=cnt++;
}
void dfs(int k,int pred,int dn){
	dep[k]=dn;
	for(int i=fl[k];i!=-1;i=rs[i].next){
		if(i==(pred^1))continue;
		int t=rs[i].t;
		if(!dep[t])dfs(t,i,dn+1);
		if(dep[k]>dep[t]){
			int lps=dep[k]-dep[t]+1;
			if(lps&1)odd[k]++ ,odd[t]--,odcnt++;
			else     even[k]++,even[t]--;
		}
	}
}
void getsums(int k){
	is_v[k]=1;
	for(int i=fl[k];i!=-1;i=rs[i].next){
		int t=rs[i].t;
		if(!is_v[t]&&dep[t]==dep[k]+1){//cout<<k<<"->"<<t<<endl;
			getsums(t);
			odd[k] +=odd[t];
			even[k]+=even[t];
		}
	}
}
int main(void){
	int a,b;
	//cin.sync_with_stdio(false);
	scanf("%d%d",&pn,&edn);
	memset(fl,-1,sizeof fl);
	for(int i=1;i<=edn;i++){
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	for(int i=1;i<=pn;i++){
		if(!dep[i]){
			is_st[i]=1;
			dfs(i,-1,1);
		}
	}
//	for(int i=1;i<=pn;i++){\
		cout<<i<<" "<<odd[i]<<" "<<even[i]<<endl;\
	}
	for(int i=1;i<=pn;i++)
		if(is_st[i])
			getsums(i);
//	cout<<odcnt<<endl;
	for(int i=1;i<=pn;i++){
		if(is_st[i])continue;
//		cout<<i<<" "<<odd[i]<<" "<<even[i]<<endl;
		if(odd[i]==odcnt&&even[i]==0){
			ans++;
		}
	}
	if(odcnt==1)ans++;
	printf("%d\n",ans);
}

T3

只gugu不说话

(雾

posted @ 2019-10-24 10:24  Miemeng_麦蒙  阅读(144)  评论(0编辑  收藏  举报

小麦在雨中,蒙蒙的雾气

麦蒙不想有人骚扰他,如果有必要 联系 QQ:1755601414

如果你嫌广告大,那就喷我吧,不是博客园的锅。