首页 > 其他分享 >2022.11.28-12.4 训练小记

2022.11.28-12.4 训练小记

时间:2022-12-01 00:12:37浏览次数:73  
标签:pq xor int 28 300 12.4 mathrm 2022.11 dis

2022.11.28 - 12.4 训练小记

UVA12620 Fibonacci Sum

斐波那契数列在取模意义下是有循环节的(具体计算以后补),一个结论是在模 \(p\) 的意义下,循环节的大小不会大于 \(6p\)。因此直接 \(\mathcal{O}(n^2)\) 判断或打表即可。对于该题结论为每 \(300\) 项为一循环节。

\(\texttt{Main Code}\)

inline void query(i64 l, i64 r){
	i64 n = r / 300 - (l + 299) / 300;
	i64 ans = n * s[300];
	ans += s[300] - s[(l - 1) % 300];
	ans += s[((r - 1) % 300 + 1) % 300];
	cout << ans << '\n';
}

CF1099 C. Postcard

分字符串中有无 * 贪心就可以了。略考验码力。

\(\texttt{Main Code}\)

void solve(){
	string s; int k; cin >> s >> k;
	int cnt = 0, cnt2 = 0, cnt3 = 0;
	for(int i = 0; i < s.length(); ++i){
		if(s[i] == '*') ++cnt3;
		else if(s[i] == '?') ++cnt2;
		else ++cnt;
	}
	if(!cnt3 && cnt < k){
		cout << "Impossible\n";
		return;
	}
	if(cnt - cnt2 - cnt3 > k){
		cout << "Impossible\n";
		return;
	}
	string ans;
	if(cnt3){
		bool ok = 1;
		int add = k - (cnt - cnt2 - cnt3);
		for(int i = 0; i < s.length(); ++i){
			if(i == s.length() - 1){
				ans += s[i];
				break;
			}
			if(s[i + 1] == '?') {++i; continue;}
			if(s[i + 1] == '*'){
				if(ok) ans.append(add, s[i]), ok = 0;
				++i; continue;
			}
			ans += s[i];
		}
	}else{
		int cur = cnt - cnt2;
		for(int i = 0; i < s.length(); ++i){
			if(i == s.length() - 1){
				ans += s[i];
				break;
			}
			if(s[i + 1] == '?'){
				if(cur < k) ans += s[i], ++cur;
				++i; continue;
			}
			ans += s[i];
		}
	}
	cout << ans << '\n';
}

P4366 [Code+#4]最短路

有一定思维的图论题。

直接加边作完全图一定会炸,考虑怎么将路径转化为等价的路径。注意到题目中从点 \(i\) 到点 \(j\) 的路径权值为 \((i~\mathrm{xor}~j) \times C\),可以证明若不考虑题目中新增的边,则从点 \(i\) 到点 \(j\) 的最短路径长即为 \((i~\mathrm{xor}~j) \times C\),因为所有 \(i~\mathrm{xor}~j\) 上为 \(1\) 的位都必定对答案有贡献。

由此,我们可以拆位考虑,对所有 \(i~\mathrm{xor}~j\) 上为 \(1\) 的位分别处理。记 \(cur\) 为目前到达的位置(初始 \(cur \gets i\)),欲使 \(cur\) 跳到点 \(j\),若 \((i~\mathrm{xor}~j)\) 的第 \(k\) 位 (0-indexed) 为 \(1\),则令 \(cur \gets cur~\mathrm{xor}~2^k\)。这个过程显然可以实现 \(i \to j\),且其耗费和同样为 \((i~\mathrm{xor}~j) \times C\)。

这启示我们对于每一个点 \(i\),只需连 \(i \to (i~\mathrm{xor}~2^k)\) 的有向边即可覆盖所有情况。此时路径的权值显然是 \(2^k \times C\)。

这样的边数是 \(\mathcal{O}(m + n \log n)\) 的,需要使用线段树优化 \(dijkstra\) 或者直接开 O2。

\(\texttt{Main Code}\)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 3e6 + 10;
struct edge{
	int v, nxt, w;
}e[M];
int head[N], tot;
inline void add(int u, int v, int w){
	e[++tot].nxt = head[u];
	head[u] = tot;
	e[tot].v = v;
	e[tot].w = w;
}
struct node{
	int val, u;
	bool operator < (const node &x) const {return val > x.val;}
};
priority_queue<node> pq;
bool vis[N];
int dis[N];
void dijkstra(int s){
	memset(dis, 0x3f, sizeof(dis));
	dis[s] = 0;
	pq.push((node){0, s});
	while(!pq.empty()){
		int u = pq.top().u; pq.pop();
		if(vis[u]) continue;
		vis[u] = 1;
		for(int i = head[u]; i; i = e[i].nxt){
			if(dis[e[i].v] > dis[u] + e[i].w){
				dis[e[i].v] = dis[u] + e[i].w;
				pq.push((node){dis[e[i].v], e[i].v});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	int n, m, C; cin >> n >> m >> C;
	int u, v, w;
	for(int i = 1; i <= m; ++i){
		cin >> u >> v >> w;
		add(u, v, w);
	}
	int to;
	for(int i = 0; i <= n; ++i){
		for(int j = 0; j <= 20; ++j){
			to = i ^ (1 << j);
			if(to <= n) add(i, i ^ (1 << j), (1 << j) * C);
		}
	}
	cin >> u >> v;
	dijkstra(u);
	cout << dis[v];
}

标签:pq,xor,int,28,300,12.4,mathrm,2022.11,dis
From: https://www.cnblogs.com/chroneZ/p/16940212.html

相关文章

  • 2022.11.30杂记
    1、ROS与Ubuntu的版本匹配: 2、“nospaceleftondevice”(磁盘空间不足)问题解决:https://blog.csdn.net/youmatterhsp/article/details/803825523、磁盘扩展后ubuntu......
  • 力扣287(java&python)-寻找重复数(中等)
    题目:给定一个包含 n+1个整数的数组 nums,其数字都在 [1,n] 范围内(包括1和n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,返回 这个重复的数......
  • 永嘉微电/VINKA原厂-VK0128B 段码LCD液晶显示屏驱动IC-32*4点,具省电模式 可替代1621
    产品品牌:永嘉微电/VINKA产品型号:VK0128B封装形式:SSOP48 概述:VK0128B是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏,也支持2COM和3COM的LCD屏。单......
  • 云计算CloudSim20221128
    在写顺序策略调度虚拟机时出现了问题原本应该是设置4台虚拟机8个任务按顺序分配,但是这里只有四个任务核两台机器发现日志中有这么几行在host中分配虚拟机失败因为MIP......
  • leetcode-628-easy
    MaximumProductofThreeNumbersGivenanintegerarraynums,findthreenumberswhoseproductismaximumandreturnthemaximumproduct.Example1:Input:n......
  • 【题解】 P8287 「DAOI R1」Flame
    题面传送门解决思路本题解是对这篇题解部分内容的补充,讨论的是两种\(\mathcal{O(m\logn)}\)的做法。大体思路都是一样的,先预处理出每一条边需要多少时间后才能连......
  • 【开发小技巧】028—使用CSS创建卡通动画加载效果
    在实际项目开发中,一般都会设计一个动画加载效果,今天这个加载效果非常有趣,可以帮助用户在等待程序加载时,缓解用户着急的情绪。HTML代码:在本文中,设计了代码的基本结构。<!DOCT......
  • 20221128 Maven - 尚硅谷(9-10)
    9.重新认识MavenMaven的完整功能在入门的时候我们介绍说Maven是一款『构建管理』和『依赖管理』的工具。但事实上这只是Maven的一部分功能。Maven本身的产品定......
  • 283. Move Zeroes
    Givenanarray nums,writeafunctiontomoveall 0'stotheendofitwhilemaintainingtherelativeorderofthenon-zeroelements.Forexample,given num......
  • 二维前缀和 P2280 激光炸弹
      #include<iostream>#include<algorithm>usingnamespacestd;ints[5005][5005],n,r;voidsov(){inti,j,ans=0;intx,y,z;cin>>n>>r;......