2019 JUST Programming Contest 题解
#还行
A:还行
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int M=2e5+10;
int head[N],cnt=1,tot,dfn[N],low[N],num,n,m,c_id[N],head1[N],res[N];
ll ans;
bool qi[N],zhong[N],bridge[M<<1];
char s[N];
struct edge{
int next,to,w;
}e[M<<2];
void add(int u,int v,int w){
e[++cnt].next=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
void tarjan(int u,int in_edge){
dfn[u]=low[u]=++num;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!dfn[v]){
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]){
bridge[i]=bridge[i^1]=true;
}
}else if(i!=(in_edge^1))
low[u]=min(low[u],dfn[v]);
}
}
void dfs(int u){
c_id[u]=tot;
if(qi[u])res[tot]++;
else if(zhong[u])res[tot]--;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(c_id[v]||bridge[i])continue;
dfs(v);
}
}
void add_c(int u,int v,int w){
e[++cnt].next=head1[u];
e[cnt].to=v;
e[cnt].w=w;
head1[u]=cnt;
}
void dfs1(int u,int f){
int now=0;
for(int i=head1[u];i;i=e[i].next){
int v=e[i].to,w=e[i].w;
if(v==f)continue;
dfs1(v,u);
int x=abs(res[v]);
ans+=w*x;now+=res[v];
}
res[u]+=now;
}
int main()
{
int t;scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
tot=num=0;cnt=1;ans=0;
for(int i=1;i<=n;i++){
head[i]=head1[i]=low[i]=dfn[i]=res[i]=c_id[i]=0;
qi[i]=zhong[i]=false;
}
scanf(" %s",s+1);
for(int i=1;i<=n;i++){
if(s[i]=='H')qi[i]=true;
else if(s[i]=='A')zhong[i]=true;
}
for(int i=1;i<=m;i++){
int a,b,c;scanf("%d %d %d",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
for(int i=1;i<=cnt;i++)bridge[i]=false;
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i,0);
for(int i=1;i<=n;i++)
if(!c_id[i]){
++tot;
dfs(i);
}
int cnt1=cnt;
for(int i=2;i<=cnt1;i+=2){
int x=e[i^1].to,y=e[i].to,w=e[i].w;
if(c_id[x]==c_id[y])continue;
add_c(c_id[x],c_id[y],w);
add_c(c_id[y],c_id[x],w);
}
dfs1(1,0);
printf("%lld\n",ans);
}
return 0;
}
B 还行
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int pre[N];
pair<int,int>pa[N];
bool ok[N];
int main()
{
int t;scanf("%d",&t);
while(t--){
int n,m,q;scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=m;i++)pa[i]=make_pair(-1,-1);
for(int i=1;i<=m+1;i++)pre[i]=i-1;
for(int i=1;i<=m;i++)ok[i]=true;
for(int i=1;i<=n;i++){
int l,r;scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++)ok[j]=false;
}
int pr=0;
for(int i=1;i<=m;i++){
if(ok[i])continue;
int k=i;
while(k<=m&&!ok[k]){
k++;
}
pre[k]=i-1;
i=k-1;
}
int now=pre[m+1];
while(now>=1){
int r=now;
int len=0;
for(;pre[now]==now-1&&now>=1;now=pre[now]){
len++;
if(pa[len].second<r)pa[len]=make_pair(now,r);
}
len++;
if(now>=1&&pa[len].second<r)pa[len]=make_pair(now,r);
now=pre[now];
}
while(q--){
int k;scanf("%d",&k);
printf("%d %d\n",pa[k].first,pa[k].second);
}
}
return 0;
}
C 队友出的,不太清楚
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
//cout<<__gcd((int)(pow(5,n)+pow(7,n)),(int)(pow(5,m)+pow(7,m)))<<endl;
if((n%2)&&(m%2)){
cout<<"12\n";
}
else {
cout<<"2\n";
}
}
}
D 不太清楚
#include<bits/stdc++.h>
using namespace std;
struct node{
int n1,n0,id;
bool operator<(node b)const{
return n1>b.n1;
}
};
int main()
{
int T;
cin>>T;
while(T--){
string a[3];
int cnt[3][2]{};
node v[3];
for(int i=0;i<3;i++){
cin>>a[i];
for(auto j:a[i]){
if(j=='0')cnt[i][0]++;
else cnt[i][1]++;
}
v[i]={cnt[i][1],cnt[i][0],i};
}
for(int i=0;i<10;i++){
sort(v,v+3);
char ch='1';
if(v[0].n1&&v[1].n0&&v[2].n0){
v[0].n1--,v[1].n0--,v[2].n0--;
}
else if(v[0].n1&&v[1].n1&&v[2].n1){
v[0].n1--,v[1].n1--,v[2].n1--;
}
else ch='0';
putchar(ch);
}
putchar('\n');
}
}
E 母鸡
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e4 + 10;
int t, n, m, num[30];
char s1[N], s2[N], s3[N];
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
cin >> n >> m;
cin >> s1 + 1;
cin >> s2 + 1;
cin >> s3 + 1;
memset(num, 0x3f3f3f3f, sizeof num);
for (int i = 1; i <= n; i++)
num[s1[i] - 'a'] = min(num[s1[i] - 'a'], s2[i] -'0');
int flag = 1, sum = 0;
for (int i = 1; i <= m; i++)
{
if (num[s3[i] - 'a'] == 0x3f3f3f3f) flag = 0;
sum += num[s3[i] - 'a'];
}
if (!flag) cout << -1 << endl;
else cout << sum << endl;
}
return 0;
}
F:不知道
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e4 + 10;
int t;
char s[N];
bool check1(char s)
{
return s >= 'a' && s <= 'z';
}
bool check2(char s)
{
return s >= 'A' && s <= 'Z';
}
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
cin >> s + 1;
int n = strlen(s + 1), flag = 1;
for (int i = 1; i <= n; i++)
{
if (check1(s[i]) || check2(s[i])) continue;
flag = 0;
}
if (!check1(s[1])) flag = 0;
if (!flag) cout << "NO\n";
else
{
vector<int>pos;
pos.push_back(1);
for (int i = 1; i <= n; i++)
if (check2(s[i])) pos.push_back(i);
if ((int)(pos.size()) <= 7) flag = 1;
else flag = 0;
if (!flag) cout << "NO\n";
else cout << "YES\n";
}
}
return 0;
}
G:签到题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;scanf("%d",&t);
while(t--){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",abs(x1-x2)+abs(y1-y2));
}
return 0;
}
H:签到
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
char s[N];
int main()
{
int t;scanf("%d",&t);
while(t--){
scanf(" %s",s);
int len=strlen(s);
bool f=1;
for(int i=0;i<len;i++){
if(s[i]=='z'){
if(i+1<len&&s[i+1]!='a')f=0;
}else {
if(i+1<len&&s[i+1]!=s[i]+1)f=0;
}
}
if(f)puts("YES");
else puts("NO");
}
return 0;
}
I:签到
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int a[N];
int main()
{
int t;scanf("%d",&t);
while(t--){
int n,k;scanf("%d%d",&n,&k);
vector<int>vt;
int sum=0;
int maxx=1e9;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<0)vt.push_back(a[i]);
else maxx=min(maxx,a[i]),sum+=a[i];
}
sort(vt.begin(),vt.end());
for(auto it:vt){
if(k==0)sum+=it;
else sum+=-it,k--,maxx=min(maxx,-it);
}
if(k&1)sum-=2*maxx;
printf("%d\n",sum);
}
return 0;
}
J:签到
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
map<int,int>mp[N];
int main()
{
int t;scanf("%d",&t);
while(t--){
int n,m;scanf("%d %d",&n,&m);
int ans=0;
for(int i=1;i<=n;i++)mp[i].clear();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int a;scanf("%d",&a);
if(mp[i-1][a])ans++,mp[i-1][a]--;
mp[i][a]++;
}
printf("%d\n",ans);
}
return 0;
}
K:听队友说是暴力
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 1e5 + 10;
int t, n, a[N];
set<int>se, ans;
int main()
{
scanf("%d", &t);
while (t--)
{
se.clear();
ans.clear();
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
ans.insert(a[1]);
se.insert(a[1]);
for (int i = 2; i <= n; i++)
{
set<int>cur = se;
se.clear();
se.insert(a[i]);
ans.insert(a[i]);
for (auto it = cur.begin(); it != cur.end(); it++)
{
se.insert(a[i] | (*it));
ans.insert(a[i] | (*it));
}
}
printf("%d\n", (int)ans.size());
}
return 0;
}
L:不太清楚
#include<bits/stdc++.h>
using namespace std;
int n,m,w,h;
const int N=2e3;
int a[N][N];
int pre[N][N];
bool check(int x){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+(a[i][j]>x);
}
}
for(int i=h;i<=n;i++){
for(int j=w;j<=m;j++){
int sum=pre[i][j]+pre[i-h][j-w]-pre[i-h][j]-pre[i][j-w];
if(sum<=(w*h)/2)return true;
}
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>h>>w;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int l=1,r=n*m+1;
int ans=0;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)){
r=mid;
ans=mid;
}
else {
l=mid+1;
}
}
cout<<ans;
}