23.12.10周报(重庆省赛准备阶段,校赛,成信大校赛) (dij)

昨晚div2被狠狠拿下了,A题急了wa了一发,加10min罚时:( ,然后B题贪心模拟wa2,不想做了就run了。

星期一:

补道div2看了但没做的C题:

题意:自行理解

思路:gcd,但我第一次算成了所有a的gcd,然后wa2,实际上是求所有差值的gcd。

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=2e5+10,M=1e9+10;
const int mod=998244353;
int n;
ll a[N],gc,aa;
ll ans;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
void solve(){
	gc=ans=0;
	cin >> n;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	sort(a+1,a+n+1);
	if(a[1]<0) for(int i=n;i;i--) a[i]-=a[1];
	gc=a[n]-a[1];
	for(int i=1;i<n;i++) gc=gcd(a[i+1]-a[i],gc);
//	cout << gc << endl;//
//	for(int i=1;i<=n;i++) cout << a[i] << " ";cout << endl;//
	for(int i=n-1;i;i--){
		if(a[i+1]-a[i]!=gc){aa=a[i+1]-gc,ans+=(a[n]-aa)/gc; break;}
	}
//	cout << aa << endl << ans << endl;//
	if(!ans) ans+=n;
	for(int i=1;i<n;i++){
		ans+=(a[n]-a[i])/gc;
	}
	cout << ans << endl;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t=1;
	cin >> t;
	while(t--) solve();
	return 0;
}
//make it count
//开ll plz

明天离散要教dijkstra最短路算法,遂又复习了一遍,上次听正义讲学会了代码怎么写,这次自己看了点文章,对其原理又加深了几分理解,明早准备享受,不过也希望通过老师的讲解领悟到新的东西。

星期二:

下午和李和强vp了场23年江西,签到题是真的签到,但签完到又被卡住了。补俩题:

K题:

题意:自行理解

思路:修改操作对答案无影响,先求差分,将其排序求前缀和,但这里代码没写过,没懂。

星期四来写,发现咋没星期三的?我昨天干了些啥,怎么回忆不起来了?

星期四:

下午在做pta,晚上困死了,一直在睡觉,然后写词频统计没写完,明早再来继续。

星期五:

题意:如题

思路:初见的时候都懵了,后来想到用优先队列,在写的时候又反应过来直接vector存结构体,然后排个序就行,不过写着还是挺麻烦的,为此学了个结构体运算符重载,和cin.get()的输入方式(可以检测空格),和输出vector内结构体数据。

代码如下:

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=1e6+10,M=1e9+10;
const int mod=998244353;
struct nod{
	string wd;
	int cnt;
	bool operator<(const nod& a) const{
		if(a.cnt!=cnt) return a.cnt<cnt;
		else return a.wd.compare(wd)>0;
	}
	bool operator==(const string &w) const{
		return this->wd==w;
	}
};
int n;
string s;
vector<nod>ve;
char trans(char a){
	if(a>='A' && a<='Z') a-='A'-'a';
	return a;
}
void solve(){
	char c;
	while(cin.get(c) && c!='#'){
		c=trans(c);
		if((c>='a' && c<='z') || (c>='0' && c<='9') || c=='_'){
			if(s.size()>14) continue;
			s+=c;
		}else{
			if(s.size()){
				vector<nod>::iterator it=find(ve.begin(),ve.end(),s);
				if(it!=ve.end()) (*it).cnt++;
				else ve.push_back({s,1});
				s.clear();
			}
		}
	}
	if(s.size()){
		vector<nod>::iterator it=find(ve.begin(),ve.end(),s);
		if(it!=ve.end()) (*it).cnt++;
		else ve.push_back({s,1});
		s.clear();
	}
	sort(ve.begin(),ve.end());
	int cnt=0;
	cout << ve.size() << endl;
	for(vector<nod>::iterator it=ve.begin();cnt<(int)ve.size()/10;cnt++,it++){
		cout << (*it).cnt << ":" << (*it).wd << endl;
	}
//	for(vector<nod>::iterator it=ve.begin();it!=ve.end();it++){
//		cout << (*it).cnt << ":" << (*it).wd << endl;
//	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
//	cin >> _;
	while(_--) solve();
	return 0;
}
//make it count
//开ll plz

晚上看了点蓝桥杯真题。

星期六:

蓝桥杯校赛被腐乳了,15名,有点失望。明天晚上会讲题,到时候补。

周日:

去成信大打了场他们学校校赛,发挥一般,也没啥好说的,倒是有道题可以补补,不过还不到找得到不。

听了校赛题解,yysy我觉得出的比成信大的题好,补补。

然后省赛前最后一周,准备恶补点图论,其次dp,虽然dp主要还是看强。

又看了遍已经忘了的链式前向星存图。

用链式前向星手打了一遍迪杰斯特拉,舒畅。水点字数,板子放下面(

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<int,int>;

const int N=2e5+10,M=1e5+10;
const int mod=998244353;
int n,m,s;
struct nod{
	int nex,to,w;
}eg[N];
int hd[N],cnt,dis[N];
bool vi[N];
void add(int u,int v,int w){
	eg[++cnt].to=v;
	eg[cnt].w=w;
	eg[cnt].nex=hd[u];
	hd[u]=cnt;
}
void dij(){
	priority_queue<PII,vector<PII>,greater<PII>>pq;
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	pq.push({0,s});
	while(pq.size()){
		int t=pq.top().second,d=pq.top().first;pq.pop();
		if(vi[t]) continue;
		vi[t]=1;
		for(int i=hd[t];i;i=eg[i].nex){
			if(d+eg[i].w<dis[eg[i].to]){
				dis[eg[i].to]=d+eg[i].w;
				pq.push({dis[eg[i].to],eg[i].to});
			}
		}
	}
}
void solve(){
	cin >> n >> m >> s;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin >> u >> v >> w;
		add(u,v,w);
	}
	dij();
	for(int i=1;i<=n;i++) cout << dis[i] << " ";
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
//	cin >> _;
	while(_--) solve();
	return 0;
}
//make it count
//开ll plz

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值