1-1代码胜于雄辩
嘿嘿
L1-2收水费
思路:分类讨论
L1-3日期
思路:模拟
L1-4回文数
思路:翻转后判断是否相等
L1-5yihan的新函数
思路:模拟
L1-6二进制
思路:二进制每位最多进位1,模拟下二进制加法即可
L1-7大山中的学院
思路:统计每个山脉对空地的贡献
L1-8堆积木
思路:由于n只有1e4,可以暴力枚举出每次放的最优位置
L2-1买!买!买!
思路:用并查集维护岛,当遍历到的两个点已经在一个岛上说明出现了环
L2-2洗牌&发牌
思路:模拟每次洗牌后的顺序,(注意有些牌需要转成特殊符号
L2-3Gwen的小剪刀
思路:二分美观度w,那么所有美观度不小于w的边都可以选,对剩余可选的边按快乐度求最小生成树即可
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=1e5+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353,M=2e5+5;
const int MAXN=1e8+5;
const double eps=1e-12;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
struct E{
int u,v,w,c;
bool operator<(const E&e)const{
return c<e.c;
}
}g[M];
int fa[N];
int n,m,t;
int find(int x){
if(x!=fa[x])fa[x]=find(fa[x]);
return fa[x];
}
bool check(int x){
for(int i=1;i<=n;++i)fa[i]=i;
vector<E>ve;
for(int i=0;i<m;++i){
if(g[i].w>=x)ve.push_back(g[i]);
}
sort(ve.begin(),ve.end());
int res=0;
for(int i=0;i<ve.size();++i){
int u=find(ve[i].u),v=find(ve[i].v);
if(u!=v){
fa[u]=v;
res+=ve[i].c;
}
}
t=res;
set<int>se;
for(int i=1;i<=n;++i){
int u=find(i);
se.insert(u);
}
if(se.size()==1)return true;
return false;
}
void solve() {
cin>>n>>m;
for(int i=0;i<m;++i){
cin>>g[i].u>>g[i].v>>g[i].w>>g[i].c;
}
int l=1,r=1e9,res,all;
while(l<=r){
int mid=l+r>>1;
if(check(mid))res=mid,all=t,l=mid+1;
else r=mid-1;
}
cout<<res<<'\n'<<all;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
// cin>>t;
// init();
while(T--){
solve();
}
return 0;
}
L2-4超时空之恋
思路:赛时的时候题意没搞懂,就是有三个时空的道路,且不同时空之间的同一城镇能相互传送。知道了所有道路,求1到所有点的最短路即可。然后就是求到地牢的最短时间,若到某点的最短时间不大于地牢出现在该点的最后时刻即可以该点找到地牢,对所有地牢出现时间排序即可。
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=4e6+105,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353,M=2e5+5;
const int MAXN=1e8+5;
const double eps=1e-12;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
const int dxx[8]={-1,-1,0,1,1,1,0,-1};
const int dyy[8]={0,1,1,1,0,-1,-1,-1};
void solve() {
int n,m,k;
cin>>n>>m>>k;
vector<vector<PII>>ve(3*n+5);
for(int i=0;i<m;++i){
int x,u,v,w;
cin>>x>>u>>v>>w;
ve[x*n+u].push_back({x*n+v,w});
ve[x*n+v].push_back({x*n+u,w});
}
for(int i=1;i<=n;++i){
ve[i].push_back({i+n,k});
ve[i+n].push_back({i,k});
ve[i].push_back({i+2*n,k});
ve[i+2*n].push_back({i,k});
}
vector<int>dis(3*n+5,1e18),st(3*n+5);
dis[1]=0;
priority_queue<PII,vector<PII>,greater<PII>>q;
q.push({dis[1],1});
while(q.size()){
auto [d,u]=q.top();
q.pop();
if(st[u])continue;
st[u]=1;
for(auto [v,w]:ve[u]){
if(dis[v]>d+w){
dis[v]=d+w;
q.push({dis[v],v});
}
}
}
int t;
cin>>t;
vector<PII>g(t);
for(int i=0;i<t;++i){
cin>>g[i].first>>g[i].second;
}
auto cmp=[](PII a,PII b){
return a.second<b.second;
};
sort(g.begin(),g.end(),cmp);
for(int i=0;i<t-1;++i){
auto [u,w]=g[i];
if(dis[u]<w){
cout<<w;
return ;
}else if(dis[u]<g[i+1].second){
cout<<dis[u];
return ;
}
}
if(dis[g.back().first]!=1e18)cout<<max(dis[g.back().first],g.back().second);
else cout<<-1;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
// cin>>T;
// init();
while(T--){
solve();
}
return 0;
}
L3-1计算几何的梦
思路:可以将一个数转化成质数的次方的形式,每3个相同质因子可提到根号外,对于不到3个的相同质因子对根号外没有贡献,直接消掉即可。但是枚举所有质因子的复杂度为1e6,2e4个数据会超时,枚举的质因子最大为4e4。这里考虑,若n存在不小于3个的大于4e4的相同质因子,将3个其质因子提出根号外后根号内的数一定是小于1e6的,对于1e6内可提到根号外的数在上一步枚举质因子时就已经被提出了。即枚举完4e4内的质因子后的数要么是完全立方数要么是不可提出到根号外的数
查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=4e4+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const int MAXN=1e8+5;
const double eps=1e-12;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
vector<int>st(N),primes(N);
int idx=0;
void init(){
for(int i=2;i<=4e4;++i){
if(!st[i])primes[idx++]=i;
for(int j=0;primes[j]*i<=4e4;++j){
st[primes[j]*i]=1;
if(i%primes[j]==0)break;
}
}
}
void solve() {
int n;
cin>>n;
int ans=1;
for(int i=0;i<idx;++i){
if(primes[i]>n)break;
int c=0;
while(n%primes[i]==0){
c++;
n/=primes[i];
if(c==3){ans*=primes[i],c=0;}
}
}
int l=1,r=1e6,p=1;
while(l<=r){
int mid=(l+r)/2;
if(mid*mid*mid<=n)p=mid,l=mid+1;
else r=mid-1;
}
if(p*p*p==n)ans*=p;
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
init();
while(t--){
solve();
}
return 0;
}