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;
}
加油!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本