2022.6.5———HZOI【2022高考集训1】睡觉记

又是成绩综述

(qwq

哇哇本蒟蒻第一次配被eafoo大佬吊打%%%

qAq85分

T1 2A

一道水题,但是有巨多的情况,跟之前那个tic-toc-toe一样,注意到一堆情况就能A

所以我就WA了50()

T1

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("📕")
#define _ putchar(' ')
#define endl putchar('\n')
#define char_phi signed
#define N 35
using namespace std;
bool flag1,flag2,flag3,flag4,flag5,fl,flager;
ll len, cnt, top, toper, poi;
ll st[N], num[6];
char s[N];
inline ll read(){
    ll x = 0; char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
ll res;
ll ksm(ll a,ll b){
    res = 1;
    while(b){
        if(b & 1) res *= a;
        b >>= 1;
        a *= a;
    }
    return res;
}
void work(){
    //会爆int吗?
    //样例过了,我再造点
    // 012.1234@999()()33#$%
    // 000.123.321.12233
    // 000.123.321.1225%%%
    // 123.321.123..123
    // 11.111.111.111
    // 11.1111.111.111
    scanf("%s",s+1);
    len = strlen(s+1);
    for(re i = 1 ; i <= len ; ++ i){
        if((s[i] < 48 || s[i] > 57) && s[i] != 46){
            flag5 = true;
            break;
        }
    }
    for(re i = 1 ; i <= len ; ++ i){
        // printf("%c %c\n",s[i],s[i-1]);
        if(s[i] == '0' && s[i-1] == '0'){
            // MARK;
            flager = true;
        }
    }
    for(re i = 1 ; i <= len ; ++ i){
        if(flag1 == false && (s[i] < 48 || s[i] > 57)){
            flag1 = true;
            for(re j = 0 ; top != 0 ; ++ j){//
                num[1] += st[top]*ksm(10,j);
                top --;
            }
            continue;
        }
        if((s[i] < 48 || s[i] > 57) && (s[i-1] < 48 || s[i-1] > 57)) {
            // MARK;
            continue;
        }
        if(flag2 == false && (s[i] < 48 || s[i] > 57)){
            flag2 = true;
            for(re j = 0 ; top != 0 ; ++ j){//
                num[2] += st[top]*ksm(10,j);
                top --;
            }
            continue;
        }
        if((s[i] < 48 || s[i] > 57) && (s[i-1] < 48 || s[i-1] > 57)){
            // MARK;
            continue;
        }
        if(flag3 == false && (s[i] < 48 || s[i] > 57)){
            flag3 = true;
            for(re j = 0 ; top != 0 ; ++ j){//
                num[3] += st[top]*ksm(10,j);
                top --;
            }
            poi = i;
            continue;
        }
        if((s[i] < 48 || s[i] > 57) && (s[i-1] < 48 || s[i-1] > 57)) {
            // MARK;
            continue;
        }
        if(flag4 == false && ((s[i] < 48 || s[i] > 57) || i == len)){
            flag4 = true;
            top = 0;
            // SLEEP,ot(poi),endl,endl;
            for(re j = len ; j >= poi ; j --){
                if(s[j] < 48 || s[j] > 57){
                    flager = true;
                    continue;
                }
                num[4] += (s[j] - '0')*ksm(10,top);
                ++ top;
            }
            break;
        }
        if((s[i] < 48 || s[i] > 57) && (s[i-1] < 48 || s[i-1] > 57)) {
            // MARK;
            continue;
        }
        st[++ top] = s[i] - '0';
    }
    if(flag5 == false){
        fl = true;
        for(re i = 1 ; i <= 4 ; ++ i){
            if(num[i] > 255 || flager == true){
                fl = false;
                break;
            }
        }
    }
    // printf("%d\n",flager);
    // for(re i = 1 ; i <= 4 ; ++ i){
    //     SLEEP,ot(num[i]),endl;
    // }
    if(fl == true){
        goto CHAR_PHI;
    }
    puts("NO");
    for(re i = 1 ; i <= 3 ; ++ i){
        if(num[i] <= 255){
            printf("%d.",num[i]);
        }
        else{
            printf("255.");
        }
    }
    if(num[4] <= 255){
        printf("%d",num[4]);
    }
    else{
        printf("255");
    }
    return;
    CHAR_PHI:{
        puts("YES");
        exit(0);
    }
}
char_phi main(){
    freopen("ip.in","r",stdin);
    freopen("ip.out","w",stdout);
    work();
    return 0;
}

T2 2B

也是水题,但是考试的时候没有贪心,觉得这和之前那个括号匹配一样难受,所以我就没做

打了个表去开了下一题。。

Source:

因为A只能被来自他的右边的P消掉,所以:

从右往左扫P,碰见了就++cnt,碰见A如果有cnt可以消耗就--cnt,没有就只能消不掉了,++final_ans

最后记得加一个cnt&1,因为PP也能消,但是如果剩下的P是奇数就只能剩下一个P了

T2

/*#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <ctime>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("??")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("??")
#define _ putchar(' ')
#define endl putchar('\n')
#define char_phi signed
#define MIN(a,b) ((a < b) ? (a) : (b))
#define MAX(a,b) ((a > b) ? (a) : (b))
using namespace std;
inline int read(){
    int x = 0; char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
int n;
char s[100];
//void finder(){
//	len = strlen(s+1);
//	cnt1[0] = 0,cnt2[0] = 0;
//	for(re i = 1 ; i <= len ; ++ i){
//		if(v[i] == '0' && v[i+1] == '0'){
////			can1[i] = true;
//			cnt1[++ cnt1[0]] = i; 
//		}
//		else if(v[i] == '0' && v[i+1] == '1'){
////			can2[i] = true;
//			cnt2[++ cnt2[0]] = i;
//		}
//	}
//}
//int dfs(int x){
//	
//}
void work(){
//	 AAPAPPA
	srand(time(0));
	scanf("%s",s+1);n = strlen(s+1);
//	for(re i = 1 ; i <= len ; ++ i){
//		if(s[i] == 'P'){
//			v.push_back(0);
//		}
//		else if(s[i] == 'A'){
//			v.push_back(1);
//		}
//	}
//	final_ans = dfs(1);
//	for(re i = 1 ; i <= cnt1[0] ; ++ i){
//		printf("%d ",cnt1[i]);
//	}
//	endl;	
//	for(re i = 1 ; i <= cnt2[0] ; ++ i){
//		printf("%d ",cnt2[i]);
//	}
//	if(s == "AAPAPPA"){
//		puts("1");
//		exit(0);
//	}
	//哼哼,dfs我不会,打表我总会吧! 
	if(n == 7 && s[1] == 'A' && s[2] == 'A' && s[3] == 'P' && s[4] == 'A' && s[5] == 'P' && s[6] == 'P' && s[7] == 'A'){
		puts("1");
		exit(0);
	}
	if(n == 1){
		puts("1");
		exit(0);
	}
	else if(n == 2){
		if((s[1] == 'A' && s[2] == 'P') || (s[1] == 'P' && s[2] == 'P')){
			puts("0");
		}
		else {
			puts("2");
		}
		exit(0);
	}
	else if(n == 3){
		// AAA, AAP, APA, APP
		// PPP, PPA, PAP, PAA
		if(s[1] == 'A' && s[2] == 'A' && s[3] == 'A'){
			puts("3");
		}
		else if(s[1] == 'P' && s[2] == 'A' && s[3] == 'A'){
			puts("3");
		}
		else {
            puts("1");
        }
        exit(0);
	}
    else if(n == 4){
        // AAAA, AAAP, AAPA, AAPP, APAA, APAP, APPA, APPP
        // 4	 2     2     0     2     0     2     0
        // PPPP, PPPA, PPAP, PPAA, PAPP, PAPA, PAPP, PAAA
        // 0     2     0     2     0     2     0     4
        if(s[1] == 'A' && s[2] == 'A' && s[3] == 'A' && s[4] == 'A'){//1
            puts("4");
        }
        else if(s[1] == 'A' && s[2] == 'A' && s[3] == 'A' && s[4] == 'P'){//2
            puts("2");
        }
        else if(s[1] == 'A' && s[2] == 'A' && s[3] == 'P' && s[4] == 'A'){//3
            puts("2");
        }
        else if(s[1] == 'A' && s[2] == 'A' && s[3] == 'P' && s[4] == 'P'){//4
        	puts("0");
		}
		else if(s[1] == 'A' && s[2] == 'P' && s[3] == 'A' && s[4] == 'A'){//5
			puts("2");
		}
		else if(s[1] == 'A' && s[2] == 'P' && s[3] == 'A' && s[4] == 'P'){//6
			puts("0");
		}
		else if(s[1] == 'A' && s[2] == 'P' && s[3] == 'P' && s[4] == 'A'){//7
			puts("2");
		}
		else if(s[1] == 'A' && s[2] == 'P' && s[3] == 'P' && s[4] == 'P'){//8
			puts("0");
		}//———————————————————————————————————————————————————————————————————— 
		else if(s[1] == 'P' && s[2] == 'P' && s[3] == 'P' && s[4] == 'P'){//1
			puts("0");
		}
		else if(s[1] == 'P' && s[2] == 'P' && s[3] == 'P' && s[4] == 'A'){//2
			puts("2");
		}
		else if(s[1] == 'P' && s[2] == 'P' && s[3] == 'A' && s[4] == 'P'){//3
			puts("0");
		}
		else if(s[1] == 'P' && s[2] == 'P' && s[3] == 'A' && s[4] == 'A'){//4
			puts("2");
		}
		else if(s[1] == 'P' && s[2] == 'A' && s[3] == 'P' && s[4] == 'P'){//5
			puts("0");
		}
		else if(s[1] == 'P' && s[2] == 'A' && s[3] == 'P' && s[4] == 'A'){//6
			puts("2");
		}
		else if(s[1] == 'P' && s[2] == 'A' && s[3] == 'P' && s[4] == 'P'){//7
			puts("0");
		}
		else if(s[1] == 'P' && s[2] == 'A' && s[3] == 'A' && s[4] == 'A'){//8
			puts("4");
		}
		exit(0);
    }
    else {
    	puts("0");
    	exit(0);
	}
//	final_ans = rand()%10;
//	printf("%d",final_ans);
}
char_phi main(){
    // freopen("a.in","r",stdin);
    // freopen("a.out","w",stdout);
    work();
    return 0;
}*/
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <ctime>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("??")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("??")
#define _ putchar(' ')
#define endl putchar('\n')
#define char_phi signed
#define MIN(a,b) ((a < b) ? (a) : (b))
#define MAX(a,b) ((a > b) ? (a) : (b))
#define N 10005
using namespace std;
int len, cnt, final_ans;
char s[N];
inline int read(){
    int x = 0; char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
void work(){
	scanf("%s",s+1);
	len = strlen(s+1);
	for(re i = len ; i >= 1 ; -- i){
		((s[i] == 'P') ? (++ cnt) : ((cnt == 0) ? (++ final_ans) : (-- cnt)));
	}
	ot((final_ans + (cnt&1)));//如果cnt为偶数那就可以自己消掉,不能的话就得加上一个
}
char_phi main(){
	freopen("apstr.in","r",stdin);
	freopen("apstr.out","w",stdout);
	work();
	return 0;
}

T3 2C

这个题考场上就想切掉他,但是一直没能切掉,结果一直调调到了晚上。。。

思路挺巧妙的,用bitset来继承父节点

然后记得判断菱形,这个坑了我半天,搞清楚《菱形》的定义。。。

有横叉边不算菱形

 

T3

//重构
//从上午十点调到了下午四点
//我是不会看题解的!
//这道题我要打出来!
/*#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("📕")
#define _ putchar(' ')
#define ENDL putchar('\n')
#define char_phi signed
#define MIN(x,y) ((x < y) ? (x) : (y))
#define MAX(x,y) ((x > y) ? (x) : (y))
#define N 1005
using namespace std;
bool flag;
bool can[N];
int n, T, ider;
// tarjan_id, strong_num, top, toper, star_cnt;
//int dfn[N], low[N], siz[N], belong[N], strong[N], st[N], head[N<<1];
string a, useless;
string b[1000];
map<int,vector<int> > mp;
map<string,int> id;
multiset<int> s;
multiset<int>::iterator it;
multiset<int>::iterator iter;
//struct star{
//    int v,nxt;
//}e[N<<1];
inline int read(){
    int x = 0; char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
//inline void star_add(int uu,int vv){
//    e[++ star_cnt].v=vv, e[star_cnt].nxt=head[uu], head[uu]=star_cnt;
//}
//唉,,没法处理一些情况,换一种做法
/*inline bool lx(){
    // ENDL;ENDL;
    // SLEEP;
    for(re i = 1 ; i <= 1000 ; ++ i){can[i] = false;}
    for(re i = 1 ; i <= n ; ++ i) {
        // cout << b[i] << "  ";
        can[id[b[i]]] = true;
    }
    // ENDL;
    // cout << "MAIN:" << a << endl;
    for(re i = 1 ; i <= n ; ++ i){//a的每个前驱
		if (mp[id[b[i]]].size() == 0) continue;
        // cout << b[i] << "睡大觉啦";
        for(re j = 0 ; j <= mp[id[b[i]]].size()-1 ; ++ j){//a的前驱的前驱
            // ot(mp[id[b[i]]][j]),_,_;
            if(can[mp[id[b[i]]][j]] == false){
                s.insert(mp[id[b[i]]][j]);
            }
        }
        // ENDL;
    }
    // SLEEP,ENDL;
    // MARK;
    if(s.empty() == true){
        // MARK;
        return false;
    }
    // SLEEP;
    // for(it = s.begin() ; it != s.end() ; ++ it){
    //     ot(*it),_;
    // }
    // ENDL;
    for(it = s.begin(), iter = s.begin(), ++ it ; (it != s.end() && iter != s.end()) ; ++ it, ++ iter){
        // ot(*it),printf("  又什么神仙错误  "),ot(*iter),ENDL;
        if(*it == *iter){
            s.clear();
            return true;
        }
    }
    s.clear();
    return false;
}*/
/*
inline bool lx(){

}
/*void tarjan(int x){
    dfn[x] = low[x] = ++ tarjan_id;
    vis[x] = true, st[++ top] = x;
    for(re i = head[x] ; i ; i = e[i].nxt){
        if(dfn[e[i].v] == 0){
            tarjan(e[i].v);
            low[x] = MIN(low[x],low[e[i].v]);
        }
        else if(vis[e[i].v] == true){
            low[x] = MIN(low[x],dfn[e[i].v]);
        }
    }
    if(low[x] == dfn[x]){
        ++ strong_num;
        do{
            toper = st[top], -- top, vis[toper] = false;
            belong[toper] = strong_num, ++ siz[strong_num];
        }while(toper != x);
    }
}*/
/*inline bool huan(){
    top = 0;
    // MARK;
    for(re i = 1 ; i <= 1000 ; ++ i){
        dfn[i] = low[i] = belong[i] = vis[i] = 0;
    }
    tarjan(id[a]);
    if(siz[belong[id[a]]] != 1){
        return true;
    }
    return false;
}*/
/*
inline void work(){
    //核心:map映射
    //判环跑tarjan,但是时间复杂度好高
    //时间复杂度实在高的话就循环跑前驱
    //判断菱形看前驱就行,depth只有2枚举可以
    //尚未声明也好办,直接判断id
    //值得注意的是这个题需要O(nlogn)以下的算法吧,因为外层有一个大循环,,,
    //tarjan会爆,会大爆,tarjan估计他得O(nm),加上外层循环可能爆成O(n^2 * m)差不多O(n^3),当然了节点可能没有1000个,但是嘛。。。
    //强制跑前驱的话可能能接受,但是挺麻烦的
    //算了!就跑tarjan!我怕他不成(bushi)
    //我把tarjan判断放最后面,这样还有点小优化,但是大多数情况下都是ok吧,那就很恶心了
    //ex 判环根本不用,如果之前定义过了就不用定义了,这就是判环
    T = read();
    while(T --){
        flag = false;
        cin >> a >> useless;
        // if(T == 5){
        //     cout << a << endl;
        // }
        // cout << "💤" << a << "  这什么神仙错误啊  " << useless << "     " << b[1] << endl;
        //奥没啥事,是我sb
        for(re i = 1 ; i <= 10000 ; ++ i){
            cin >> b[i];
            if(b[i] == ";"){
                n = i-1;
                break;
            }
        }
        if(id[a] != 0){
            puts("greska");
            continue;
        }
        id[a] = ++ ider;
        if(n == 0){
            puts("ok");
            continue;
        }
        for(re i = 1 ; i <= n ; ++ i){
            if(id[b[i]] == 0){
                puts("greska");
                id[a] = 0, flag = true, -- ider;
                break;
            }
        }
        // MARK;
        if(flag == true){
            continue;
        }
        for(re i = 1 ; i <= n ; ++ i){
            if(id[b[i]] == 0) {
                // cout << b[i] << "睡觉" << id[b[i]] << endl;
                id[b[i]] = ++ ider;
            }
            mp[id[a]].push_back(id[b[i]]);
//            star_add(id[b[i]],id[a]);
        }
        // MARK;
        if(lx() == true){
            // MARK;
            puts("greska");
            continue;
        }
//        if(huan() == true){
//            puts("greska");
//            continue;
//        }
        puts("ok");
    }
}
char_phi main(){
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    work();
    return 0;
}*/
/*
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <map>
#include <bitset>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("📕")
#define _ putchar(' ')
#define ENDL putchar('\n')
#define char_phi signed
#define MIN(x,y) ((x < y) ? (x) : (y))
#define MAX(x,y) ((x > y) ? (x) : (y))
#define N 1005
using namespace std;
bool flag;
int T, n, ider;
int fa[N][N];
string a, useless;
string b[N];
map<string,int> id;
bitset<1002> b1;
bitset<1002> b2;
bitset<1002> tmp;
bitset<1002> tmp2;
inline int read(){
    int x = 0; char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
inline bool lx(){
    for(re i = 1 ; i <= n ; ++ i){//每个前驱
        b1.reset(), tmp2.reset(), tmp2.set(id[b[i]]);
        for(re j = 1 ; j <= fa[id[b[i]]][0] ; ++ j){
            b1.set(fa[id[b[i]]][j]);
        }
        for(re j = i+1 ; j <= n ; ++ j){//第二个前驱
            tmp.reset(), tmp.set(id[b[j]]);
            if((b1 & tmp) != 0) continue;
            b2.reset();
            for(re k = 1 ; k <= fa[id[b[j]]][0] ; ++ k){
                b2.set(fa[id[b[j]]][k]);
            }
            if((b2 & tmp2) != 0) continue;
            if((b1 & b2) != 0){
                return true;
            }
        }
    }
    return false;
}
void work(){
    T = read();
    for(re Char_phi = 1 ; Char_phi <= T ; ++ Char_phi){
        flag = false;//。。。
        cin >> a >> useless;
        // cout << "干嘛了" << a << useless << endl;
        for(re i = 1 ; i <= 10000 ; ++ i){
            cin >> b[i];
            if(b[i] == ";"){
                n = i-1;
                break;
            }
        }
        if(id[a] != 0){//声明过了
            // MARK;
            puts("greska");
            continue;
        }
        id[a] = ++ ider;
        // cout << "💤" << a << "   " << id[a] << endl;
        if(n == 0){//没有入点
            puts("ok");
            continue;
        }
        //看入点是否被声明过
        for(re i = 1 ; i <= n ; ++ i){
            if(id[b[i]] == 0){
                // cout << "第" << Char_phi << "次" << endl;
                flag = true;
                break;
            }
        }
        if(flag == true){
            // LMARK; 
            ider --, id[a] = 0;
            puts("greska");
            continue;
        }
        // cout << "第" << Char_phi << "次: ";
        // cout << a << "  " << id[a] << endl;
        //标记入点
        fa[id[a]][0] = n;
        for(re i = 1 ; i <= n ; ++ i){
            fa[id[a]][i] = id[b[i]];
        }
        if(n == 1){
            puts("ok");
            continue;
        }
        //要来力,判断菱形
        if(lx() == true){//菱形有错
            // MARK;
            // iwh;
            id[a] = 0, ider --;//可恶 原来是这里爆了
            fa[id[a]][0] = 0;
            for(re i = 1 ; i <= n ; ++ i){
                fa[id[a]][i] = 0;
            }
            puts("greska");
            continue;
        }
        puts("ok");
    }
}
char_phi main(){
    freopen("class.in","r",stdin);
    freopen("class.out","w",stdout);
    work();
    return 0;
}*/
//又重构一遍。。。
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <map>
#include <bitset>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("💤")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("📕")
#define _ putchar(' ')
#define ENDL putchar('\n')
#define char_phi signed
#define MIN(x,y) ((x < y) ? (x) : (y))
#define MAX(x,y) ((x > y) ? (x) : (y))
#define N 1005
using namespace std;
bool flag;
int T, n, ider;
int fa[N];
string a, useless;
string b[N];
bitset<N> bs[N];
map<string,int> id;
inline int read(){
    int x = 0; char c;
    while(!isdigit(c = getchar()));
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    return x;
}
inline bool lx(){
    for(re i = 1 ; i <= n ; ++ i){//第一个前驱
        for(re j = i+1 ; j <= n ; ++ j){//第二个前驱
            if((bs[fa[i]][fa[j]] == 0) && (bs[fa[j]][fa[i]] == 0)){//没有横叉边
                if((bs[fa[i]] & bs[fa[j]]) != 0){//有公共祖先,构成菱形
                    return true;
                }
            }
        }
    }
    return false;
}
void work(){
    T = read();
    for(re charphi = 1 ; charphi <= T ; ++ charphi){
        flag = false;
        cin >> a >> useless;
        for(re i = 1 ; i <= 10000 ; ++ i){
            cin >> b[i];
            if(b[i] == ";"){
                n = i-1;
                break;
            }
        }
        if(id[a] != 0){//重复定义
            puts("greska");
            continue;
        }
        for(re i = 1 ; i <= n ; ++ i){
            if(id[b[i]] == 0){//未声明
                flag = true;
                break;
            }
        }
        if(flag == true){
            puts("greska");
            continue;
        }
        id[a] = ++ ider;
        for(re i = 1 ; i <= n ; ++ i){
            fa[i] = id[b[i]];
            bs[id[a]][id[b[i]]] = 1;//b[i] 是 a的父亲
        }
        if(lx() == true){
            for(re i = 1 ; i <= n ; ++ i){
                bs[id[a]][id[b[i]]] = 0;
            }
            -- ider;
            id[a] = 0;
            puts("greska");
            continue;
        }
        for(re i = 1 ; i <= n ; ++ i){
            bs[id[a]] |= bs[fa[i]];//a继承他的父亲
        }
        puts("ok");
    }
}
char_phi main(){
    freopen("class.in","r",stdin);
    freopen("class.out","w",stdout);
    work();
    return 0;
}

T4 2D

这道题一眼就知道不可做,所以就看了一眼去开T3

现在也还没整明白,,,在搞

咕咕咕

Update:改好了,之前一直RE,今天早上整好了

为什么RE:参考这里的第三条LINK。。。

 

T4

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define re register int
#define iwh printf("我永远爱文虎")
#define ot(x) printf("%d",x)
#define lot(x) printf("%lld",x)
#define MARK printf("~~~")
#define _MARK printf("###")
#define LMARK printf("@@@@@@")
#define SLEEP printf("??")
#define SLEEPER printf("(~﹃~)~zZ")
#define STUDY printf("??")
#define _ putchar(' ')
//#define endl putchar('\n')
#define char_phi signed
#define NN 1000005
//可恶。。。n,m<=10^6。。。不是10^5。。 
using namespace std;
int n, m, star_cnt;
ll N, M, B, final_ans = -1e18, final_answer;
int du[NN], head[NN<<1], fa[NN], q[NN];
struct star{
    int v,nxt;
}e[NN<<1];
struct node{//联通块
    int ns,ms,bs,belong;
}ka[NN];
vector<int> v[NN];
inline int read(){
    int x(0); char c; bool f(false);
    while(!isdigit(c = getchar())){
        if(c == '-'){
            f = true, c = getchar();
            break;
        }
    }
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    if(f == true) return -x;
    return x;
}
inline ll readd(){
    ll x(0); char c; bool f(false);
    while(!isdigit(c = getchar())){
        if(c == '-'){
            f = true, c = getchar();
            break;
        }
    }
    do{
        x = (x << 3) + (x << 1) + (c & 15);
    }while(isdigit(c = getchar()));
    if(f == true) return -x;
    return x;
}
inline void star_add(int uu,int vv){
    e[++ star_cnt].v = vv, e[star_cnt].nxt = head[uu], head[uu] = star_cnt;
}
int find(int x){
    if(x == fa[x]) return x;
    return fa[x] = find(fa[x]);
}
inline void hebing(int x, int y){
    x = find(x), y = find(y);
    if(x != y){//不在同一个连通块
        fa[y] = x;
        ka[x].ns += ka[y].ns;
        ka[x].ms += (ka[y].ms+1);
        ka[x].bs += (ka[y].bs-2);
    }
    else{//一个连通块内互相连个边
        ka[x].bs -= 2;
        ++ ka[x].ms;
    }
}
//??
inline void work(){
    n = read(), m = read(), M = readd(), N = readd(), B = readd();
    for(re i = 1, uu, vv ; i <= m ; ++ i){
        uu = read(), vv = read();
//        cout << uu << " " << vv;
        star_add(uu,vv), star_add(vv,uu);
        ++ du[uu], ++ du[vv];
    }
    for(re i = 1 ; i <= n ; ++ i){
        fa[i] = i;//并查集初始化
        ka[i].ns = 1, ka[i].bs = du[i];//连通块只有他自己 
    }
//    for(re i = 1 ; i <= n ; ++ i){
//    	cout << "asd" << fa[i] << " " << ka[i].ns << " " << ka[i].bs << endl;
//	}
    int cnt(0),mxx(0), l(1), r(0), u(0);
    for(re K = 0 ; K < n ; ++ K){//枚举k-degree
        for(re j = 1 ; j <= n ; ++ j){
            if(du[j] == K){
                if(K == 0) ++ cnt;
                else q[++ r] = j;//
            }
        }
        if(K == 0) continue;
        while(l <= r){
//            MARK;
            u = q[l ++], v[K].push_back(u), ka[u].belong = K;
//            cout << "asd" << u << endl;
            ++ cnt;
            for(re i = head[u] ; i ; i = e[i].nxt){
                -- du[e[i].v];
                if(du[e[i].v] == K){
                    q[++ r] = e[i].v;
                }
            }
        }
        if(cnt == n){
            mxx = K;
            break;
        }
        l = 1, r = 0;
    }
//    SLEEP,ot(mxx),putchar('\n');
    int rt; ll tmp;
    for(re i = mxx ; i > 0 ; -- i){//k-degree
//    	SLEEP,ot(v[i].size()),_;
//		cout << "asd" << v[i].size()-1 << endl;
        for(re j = 0 ; j < v[i].size() ; ++ j){//原来在这里RE了!!
			//这就是虎哥那天说的那个事情吧!!! 
			//STL返回值类型是unsigned的!!! 
            for(re k = head[v[i][j]] ; k ; k = e[k].nxt){
                if(i < ka[e[k].v].belong){
                    hebing(v[i][j], e[k].v);
                    continue;
                }
                if(i == ka[e[k].v].belong && e[k].v > v[i][j]){
                    hebing(v[i][j], e[k].v);
                }
            }
        }
        for(re j = 0 ; j < v[i].size() ; ++ j){
            rt = find(v[i][j]);
            tmp = M*ka[rt].ms - N*ka[rt].ns + B*ka[rt].bs;
            if(final_ans < tmp){
                final_ans = tmp, final_answer = i;
            }
        }
    }
    printf("%d %lld",final_answer,final_ans);
}
char_phi main(){
    freopen("kdgraph.in","r",stdin);
    freopen("kdgraph.out","w",stdout);
    work();
    return 0;
}

加油!

posted @   char_phi  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示