呃呃 明天就考试了 今天就vp了一场
好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊
A
暴力
不能整除就continue else 那就存进set
#include <bits/stdc++.h>
using namespace std;
const int N = 210;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int n,k,a[N];
signed main(){
fast
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
set<int>s;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
for(int r=j+1;r<=n;r++){
for(int m=r+1;m<=n;m++){
if((a[i]+a[j]+a[r]+a[m])%4)continue;
else s.insert((a[i]+a[j]+a[r]+a[m])/4);
}
}
}
}
while(k--){
int b[N];
int r;cin>>r;
for(int i=1;i<=r;i++){
cin>>b[i];
}
for(int i=1;i<=r;i++){
if(s.count(b[i])==0){cout<<"No"<<endl;goto out;}
}
cout<<"Yes"<<endl;
out:1;
}
return 0^0;
}
B
感觉写的很稀里糊涂的
但是一下就过了
大概就是其tan是唯一的
我们用tan存 然后dist排序
然后有连续1就可以一起击倒 思维吗?感觉这个思维难度还不如div2 a
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
struct G{
double tan;
int dist;
int w;
bool operator < (const G &W)const{
return dist<W.dist;
}
}g[N];
signed main(){
fast
int n;cin>>n;
int sum=0;
map<double,vector<int>>mp;
for(int i=1;i<=n;i++){
double a,b;int c;cin>>a>>b>>c;
sum+=c;
g[i]={b/a,(int)(a+b),c};
mp[b/a].push_back(i);
}
int cnt=0;
for(auto i:mp){
vector<G>v;
for(auto j:i.second)v.push_back(g[j]);
sort(v.begin(),v.end());
for(int i=0;i<v.size()-1;i++){
if(v[i].w==1&&v[i+1].w==1)cnt++;
}
}
cout<<sum<<' '<<n-cnt<<endl;
return 0^0;
}
C
第一个floyd跑最短路 然后遍历看谁最长 这个没话说
第二个就是dijkstra 维护最短路的同时维护一个 w2的最大就可以了
很多人说不能堆优化啊
边数最多N^2 点N nlog随便过啊???
路径打印很神秘啊(不过我用string来存也能过 没有MLE
今天算是学到了!
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
const int M = 1e6+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
typedef pair<int,int> PII;
int n,m,g[N][N],k,t[M],h[N],e[M],ne[M],w1[M],w2[M],idx,dist[M],dist1[M],pre[M];
bool st[M];
void add(int a,int b,int c,int d){
e[idx]=b;
w1[idx]=c;
w2[idx]=d;
ne[idx]=h[a];
h[a]=idx++;
}
void print(int x){
if(pre[x]==-1)return;
print(pre[x]);
cout<<"->"<<x;
}
signed main(){
fast
cin>>n>>m;
memset(h,-1,sizeof h);
memset(g,0x3f3f,sizeof g);
for(int i=1;i<=m;i++){
int a,b,c,d;cin>>a>>b>>c>>d;
g[a][b]=c,g[b][a]=c;
add(a,b,c,d),add(b,a,c,d);
}
cin>>k;
for(int i=1;i<=k;i++)cin>>t[i];
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
}
}
int ans=2e9,cnt=0;
for(int i=1;i<=n;i++){
int mx=-2e9;
for(int j=1;j<=n;j++){
mx=max(mx,g[i][j]);
}
if(ans>mx)ans=mx,cnt=i;
}
cout<<cnt<<endl;
memset(dist,0x3f3f,sizeof dist);
memset(pre,-1,sizeof pre);
priority_queue<PII,vector<PII>,greater<>>q;
q.push({0,cnt});
dist[cnt]=0;
while(q.size()){
auto [dis,ver]=q.top();q.pop();
if(st[ver])continue;st[ver]=1;
for(int i=h[ver];~i;i=ne[i]){
int j=e[i];
if(dist[j]>dist[ver]+w1[i]){
dist[j]=dist[ver]+w1[i];
dist1[j]=dist1[ver]+w2[i];
pre[j]=ver;
q.push({dist[j],j});
}else if(dist[j]==dist[ver]+w1[i]&&dist1[j]<dist1[ver]+w2[i]){
dist1[j]=dist1[ver]+w2[i];
pre[j]=ver;
q.push({dist[j],j});
}
}
}
for(int i=1;i<=k;i++){
cout<<cnt;
print(t[i]);
cout<<endl;
cout<<dist[t[i]]<<' '<<dist1[t[i]]<<endl;
}
return 0^0;
}