1、Day1
早上睡醒7:30,,吃完饭8:00.。。。
赶紧跑到图书馆(打算耗中午的时间,在家太吵),,然后震惊的是还没开门,据说今天是九点开,,,然后我就方了。。。
趁着有早有跑到打印店(大概10mins),然后等着可以下题面。。。
大概8:30的时候可以登录了,,,但是,网站实在太卡,,以至于根本打不开。。
过了5mins大概群里终于有人打开了发了PDF,,然后印了出来,拿着边走边回到图书馆门口大约是8:40,,在门口看题面(幸好带了笔),,应该没有浪费时间吧qwq?
然后是乱搞写题:
最后还有大约1小时,也就是12:30的时候,,,就弃坑写不出来不写了。。。
然后就是各种水群。。。
T1:
#1, Q=0是什么操作,,只要交了就有五分???(emmm,虽然还要文件读写不写错,文件名不写错,不能RE,CE,UKE,,)
然后就不太会了,据说是bzoj3551Kruskal重构树,然而没写过,也没时间重新去搞了,,就丢掉了,,,(然后Candy?小哥哥帮我敲了一个暴力,成为了我分数最高的一道题。。。)
T2:我只会枚举排列求逆序对判断。(最裸的暴力,,期望40分
T3:我只会枚举所有子串判断(最裸的暴力,期望10分,,,然而交了以后发现没有去重,,,还有1h,,一边吃午饭一边水群,算了懒得改了,反正暴力也就10分。。
T1、return.cpp
:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 2e5+5, M = 4e5+5, inf = 1e9+5;
#define pii pair<int, int>
#define fir first
#define sec second
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
}
int n, m, Q, K, S;
struct edge {int v, ne, w, a;} e[M<<1];
int cnt = 1, h[N];
inline void ins(int u, int v, int w, int a) {
e[++cnt] = (edge) {v, h[u], w, a}; h[u] = cnt;
e[++cnt] = (edge) {u, h[v], w, a}; h[v] = cnt;
}
int d[N], done[N];
priority_queue<pii, vector<pii>, greater<pii> > q;
void dijkstra(int s) {
for(int i=1; i<=n; i++) d[i] = inf, done[i] = 0;
d[s] = 0;
q.push(make_pair(d[s], s));
while(!q.empty()) {
int u = q.top().sec; q.pop();
if(done[u]) continue;
done[u] = 1;
for(int i=h[u]; i; i=e[i].ne) {
int v = e[i].v;
if(d[v] > d[u] + e[i].w) {
d[v] = d[u] + e[i].w;
q.push(make_pair(d[v], v));
}
}
}
}
namespace brute_force {
const int N = 1505;
int vis[N], head, tail;
int bfs(int s, int p) { //printf("bfs %d %d
", s, p);
memset(vis, 0, sizeof(vis));
static int q[N];
head = tail = 1;
q[tail++] = s; vis[s] = 1;
int ans = d[s];
while(head != tail) {
int u = q[head++];
for(int i=h[u]; i; i=e[i].ne) if(e[i].a > p) {
int v = e[i].v;
if(vis[v]) continue;
vis[v] = 1;
ans = min(ans, d[v]);
q[tail++] = v;
}
}
return ans;
}
void solve() {
dijkstra(1);
int ans = 0;
while(Q--) {
int v0, p0, v, p;
cin >> v0 >> p0;
v = (v0 + K * ans - 1) % n + 1;
p = (p0 + K * ans) % (S+1);
ans = bfs(v, p);
cout << ans << '
';
}
}
}
struct meow {
int u, v, a;
bool operator < (const meow &r) const {
return a > r.a;
}
} me[M];
namespace off_line {
struct quer {
int p, v, id;
bool operator < (const quer &r) const {
return p > r.p;
}
} p[N];
int fa[N], val[N];
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
int ans[N];
void Union(int x, int y) { //printf("Union %d %d
", x, y);
x = find(x); y = find(y);
if(x == y) return;
fa[y] = x;
val[x] = min(val[x], val[y]);
//printf("hey %d %d
", x, val[x]);
}
void solve() {
dijkstra(1);
for(int i=1; i<=n; i++) fa[i] = i, val[i] = d[i];
for(int i=1; i<=Q; i++) p[i].v = read(), p[i].p = read(), p[i].id = i;
sort(me+1, me+1+m);
sort(p+1, p+1+Q);
int now = 1;
for(int i=1; i<=Q; i++) {
int now_p = p[i].p, now_v = p[i].v;
//printf("p %d %d %d
", p[i].v, p[i].p, me[now].a);
while(now <= m) {
if(me[now].a > now_p) Union(me[now].u, me[now].v), now++;
else break;
}
int x = find(now_v);
ans[p[i].id] = val[x];
}
for(int i=1; i<=Q; i++) cout << ans[i] << '
';
}
}
int main() {
freopen("return.in", "r", stdin);
freopen("return.out", "w", stdout);
int T; cin >> T;
while(T--) {
cnt = 1;
memset(h, 0, sizeof(h));
cin >> n >> m;
for(int i=1; i<=m; i++) {
int u = read(), v = read(), l =read(), a = read();
ins(u, v, l, a);
me[i] = (meow) {u, v, a};
}
cin >> Q >> K >> S;
if(n <= 1500) brute_force::solve();
else if(K == 0) off_line::solve();
//off_line::solve();
}
}
T2、inverse.cpp
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 50050
#define mod 998244353
using namespace std;
//逆序对
int a[maxn];
void MergeSort(int l, int r, int &ans){
if(l >= r)return ;
int m = (l+r)>>1;
MergeSort(l,m,ans);
MergeSort(m+1,r,ans);
int i = l, j = m+1;
int t[r-l+1], k = 0;
while(i<=m && j<=r){
if(a[i]<=a[j])t[k++]=a[i++];
else{
t[k++] = a[j++];
ans += m-i+1;//加上剩余元素个数
}
}
while(i<=m)t[k++]=a[i++];
while(j<=r)t[k++]=a[j++];
for(i=l, k=0; i <= r; i++,k++)a[i]=t[k];
}
int getcount(int b[], int n){
int ans = 0;
for(int i = 1; i <= n; i++)a[i] = b[i];
MergeSort(1,n,ans);
return ans;
}
//题目
int q[maxn];
int main(){
freopen("inverse.in","r",stdin);
freopen("inverse.out","w",stdout);
//逆序对
int T; cin>>T;
while(T--){
int ans = 0;
int n; cin>>n;
for(int i = 1; i <= n; i++)cin>>q[i];
next_permutation(q+1, q+n+1);
do{
int cc = 0;
for(int i = 1; i <= n; i++){
cc += abs(i-q[i]);
}
cc /= 2;
if(cc == getcount(q,n)){
ans++;
}
}while(next_permutation(q+1, q+n+1));
cout<<(ans%mod)<<'
';
}
return 0;
}
T3name.cpp
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(){
freopen("name.in","r",stdin);
freopen("name.out","w",stdout);
string S;
cin>>S;
int Q; cin>>Q;
for(int i = 1; i <= Q; i++){
string T; int l, r; cin>>T>>l>>r;
string a = T, b = S.substr(l-1,r-l+1);
int ans = 0;
for(int i = 0; i < a.size(); i++){
for(int j = i; j < a.size(); j++){
string c = a.substr(i,j-i+1);
if(b.find(c) == string::npos){
ans++;
}
}
}
cout<<ans<<'
';
}
return 0;
}
期望得分:80+40+5 = 125
实际得分:75+8+0 = 83
据说现场选手基本都是200+。
2、Day2
DAY2咕咕咕掉了。