Skip to content

Commit c9e23ce

Browse files
committed
2021.01.22
1 parent f8eb568 commit c9e23ce

File tree

8 files changed

+381
-99
lines changed

8 files changed

+381
-99
lines changed

cplus/test.cpp

Lines changed: 10 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,15 @@
1-
#include <bits/stdc++.h>
1+
#include <iostream>
22
using namespace std;
33

4-
struct Edge{
5-
int v, c, dual;
6-
Edge(){}
7-
Edge(int v, int c, int dual) : v(v), c(c), dual(dual) {}
8-
};
4+
int main(void){
5+
ios::sync_with_stdio(false);
6+
double n1 = 2.555;
7+
double n2 = 2.565;
98

10-
vector<Edge> g[10101];
11-
int k, n;
12-
const int s = 1 * 2 + 1;
13-
const int t = 2 * 2;
9+
cout<<fixed;
10+
cout.precision(2);
11+
cout<<n1<<'\n';
12+
cout<<n2<<'\n';
1413

15-
void addEdge(int s, int e, int x){
16-
g[s].emplace_back(e, 1, g[e].size());
17-
g[e].emplace_back(s, 0, g[s].size()-1);
18-
}
19-
20-
void init(){
21-
for(int i=0; i<10101; i++) g[i].clear();
22-
}
23-
24-
bool flow(){
25-
int path[10101] = {0};
26-
int par[10101]; memset(par, -1, sizeof par);
27-
queue<int> q; q.push(s);
28-
while(q.size()){
29-
int now = q.front(); q.pop();
30-
for(int x=0; x<g[now].size(); x++){
31-
auto i = g[now][x];
32-
int nxt = i.v;
33-
int cap = i.c;
34-
int dual = i.dual;
35-
if(par[nxt] == -1 && cap > 0){
36-
par[nxt] = now;
37-
path[nxt] = x;
38-
q.push(nxt);
39-
}
40-
}
41-
}
42-
if(par[t] == -1) return 0;
43-
44-
for(int i=t; i!=s; i=par[i]){
45-
int a = par[i], b = i;
46-
g[a][path[b]].c --;
47-
int dual = g[a][path[b]].dual;
48-
g[b][dual].c ++;
49-
}
50-
return 1;
51-
}
52-
53-
void print(){
54-
int prv = -2, now = s;
55-
while(now/2 != 2){
56-
if(now & 1) printf("%d ", now/2);
57-
prv = now;
58-
if(now % 2 == 0){
59-
now = now + 1; continue;
60-
}
61-
for(int i=0; i<g[now].size(); i++){
62-
int nxt = g[now][i].v;
63-
if(nxt/2 == now/2) continue;
64-
if(g[now][i].c == 0){
65-
g[now][i].c = 1;
66-
now = nxt;
67-
break;
68-
}
69-
}
70-
}
71-
printf("%d\n", 2);
72-
}
73-
74-
void solve(int tc){
75-
init();
76-
for(int i=1; i<=n; i++){
77-
addEdge(i*2, i*2+1, 1);
78-
int j; char c;
79-
while(1){
80-
scanf("%d%c", &j, &c);
81-
addEdge(i*2+1, j*2, 1);
82-
if(c == '\n') break;
83-
}
84-
}
85-
86-
printf("Case %d:\n", tc);
87-
for(int i=0; i<k; i++){
88-
if(!flow()){
89-
printf("Impossible\n\n"); return;
90-
}
91-
}
92-
93-
for(int i=0; i<k; i++) print();
94-
printf("\n");
95-
}
96-
97-
int main(){
98-
int asdf = 1;
99-
while(1){
100-
scanf("%d %d", &k, &n);
101-
if(!k && !n) break;
102-
solve(asdf++);
103-
}
14+
return 0;
10415
}

python/plat4/1014.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
T = int(input())
5+
6+
dy,dx = [-1,-1,0],[-1,1,-1]
7+
def check(y,x):
8+
global N, M
9+
if arr[y][x]=='x':
10+
return False
11+
for i in range(3):
12+
ny,nx = y+dy[i],x+dx[i]
13+
if 0<=ny<N and 0<=nx<M:
14+
if arr[ny][nx]=='0':
15+
return False
16+
return True
17+
18+
def dp(bit,idx):
19+
global N, M, limit_bit,ed
20+
if idx == ed:return 0
21+
if dp_arr[idx][bit]!=-1:
22+
return dp_arr[idx][bit]
23+
y = idx//M
24+
x = idx%M
25+
res = 0
26+
if check(y,x):
27+
arr[y][x]='0'
28+
d1 = dp(((bit<<1)|1)&limit_bit,idx+1)+1
29+
arr[y][x]='.'
30+
d2 = dp((bit<<1)&limit_bit,idx+1)
31+
res = max(d1,d2)
32+
else:
33+
res = dp((bit<<1)&limit_bit,idx+1)
34+
dp_arr[idx][bit]=res
35+
return res
36+
37+
while T:
38+
T-=1
39+
N, M = map(int,input().split())
40+
ed = N*M
41+
#최근 M+1개 비트
42+
#현재 idx(Y*M+X)
43+
#dp
44+
dp_arr = [[-1]*(1<<M+1) for _ in range(N*M+1)]
45+
limit_bit = (1<<(M+1))-1
46+
arr = [list(input().strip()) for _ in range(N)]
47+
print(dp(0,0))

python/plat4/11378.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import sys
2+
3+
input = sys.stdin.readline
4+
#print = sys.stdout.write
5+
6+
def dfs():
7+
ans = 0
8+
while True:
9+
q = [st]
10+
flag=False
11+
visited=[-1]*2050
12+
while q:
13+
n = q.pop()
14+
15+
for nx in adj[n]:
16+
if cap[n][nx]-fl[n][nx]<=0:continue
17+
if visited[nx]!=-1:continue
18+
q.append(nx)
19+
visited[nx]=n
20+
if nx==ed:
21+
flag = True
22+
break
23+
if flag:break
24+
if visited[ed]==-1:break
25+
now = ed
26+
while now!=st:
27+
fl[visited[now]][now]+=1
28+
fl[now][visited[now]]-=1
29+
now = visited[now]
30+
ans+=1
31+
return ans
32+
33+
N, M, K = map(int,input().split())
34+
adj = [[] for _ in range(2050)]
35+
cap = [[0]*2050 for _ in range(2050)]
36+
fl = [[0]*2050 for _ in range(2050)]
37+
st,ed = 0,2021
38+
tmp = 2020
39+
adj[st]=[n for n in range(1,N+1)]+[tmp]
40+
cap[st][tmp]=K
41+
for i in range(N+1,N+M+1):
42+
cap[i][ed]=1
43+
adj[i].append(ed)
44+
for i in range(1,N+1):
45+
row = list(map(int,input().split()))
46+
adj[i].append(tmp)
47+
adj[tmp].append(i)
48+
cap[st][i]=1
49+
cap[tmp][i]=K
50+
for num in row[1:]:
51+
cap[i][num+N]=1
52+
adj[i].append(num+N)
53+
adj[num+N].append(i)
54+
cap[num+N][ed]=1
55+
print("%d\n"%dfs())

python/plat4/1280.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
N = int(input())
5+
6+
tree = [0]*(200001)
7+
cnt = [0]*(200001)
8+
n = int(input())+1
9+
tmp = n
10+
while tmp<=200000:
11+
cnt[tmp]+=1
12+
tree[tmp]+=n
13+
tmp+=(tmp&-tmp)
14+
ans = 1
15+
total = n
16+
for i in range(1,N):
17+
n = int(input())+1
18+
tmp = n
19+
p=q=0
20+
while tmp:
21+
p+=cnt[tmp]
22+
q+=tree[tmp]
23+
tmp-=(tmp&-tmp)
24+
ans *= p*n-q+total-q-(i-p)*n
25+
ans%=1000000007
26+
tmp = n
27+
while tmp<=200000:
28+
cnt[tmp]+=1
29+
tree[tmp]+=n
30+
tmp+=(tmp&-tmp)
31+
total+=n
32+
print(ans)

python/plat4/14868.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
N, K = map(int,input().split())
6+
dx,dy = [0,0,1,-1],[-1,1,0,0]
7+
8+
arr = [[0]*N for _ in range(N)]
9+
u = [[num,1] for num in range(K+1)]
10+
def find(x):
11+
if u[x][0]!=x:
12+
u[x][0]=find(u[x][0])
13+
return u[x][0]
14+
15+
def Union(x,y):
16+
x=find(x)
17+
y=find(y)
18+
if x!=y:
19+
if u[x][1]<u[y][1]:x,y=y,x
20+
u[y][0]=x
21+
u[x][1]+=u[y][1]
22+
return u[x][1]
23+
def bfs():
24+
cnt = 0
25+
while True:
26+
l = len(st)
27+
cnt+=1
28+
flag = False
29+
while l:
30+
l-=1
31+
y,x,p = st.popleft()
32+
visited[y][x]=1
33+
for i in range(4):
34+
ny,nx=y+dy[i],x+dx[i]
35+
if 0<=ny<N and 0<=nx<N:
36+
if arr[ny][nx]:
37+
if arr[ny][nx]!=p:
38+
if Union(arr[ny][nx],p)==K:
39+
flag=True
40+
if visited[ny][nx]:
41+
cnt-=1
42+
else:
43+
st.append([ny,nx,p])
44+
arr[ny][nx]=p
45+
if flag:return cnt
46+
47+
visited = [[0]*N for _ in range(N)]
48+
st = deque()
49+
for num in range(1,K+1):
50+
x,y = map(int,input().split())
51+
arr[y-1][x-1]=num
52+
st.append([y-1,x-1,num])
53+
print(bfs())

python/plat4/4196.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
5+
T = int(input())
6+
sys.setrecursionlimit(100000)
7+
8+
def dfs(now):
9+
visited[now]=True
10+
for nx in adj_f[now]:
11+
if visited[nx]:continue
12+
dfs(nx)
13+
global cur_time
14+
finish_time.append(now)
15+
return
16+
def dfs_b(now,idx):
17+
visited[now]=True
18+
scc[idx].append(now)
19+
scc_dict[now]=idx
20+
for nx in adj_b[now]:
21+
if visited[nx]:continue
22+
dfs_b(nx,idx)
23+
24+
25+
while T:
26+
T-=1
27+
28+
N, M = map(int,input().split())
29+
ans = 0
30+
adj_f = [[] for _ in range(N+1)]
31+
adj_b = [[] for _ in range(N+1)]
32+
finish_time = [0]*(N+1)
33+
scc = []
34+
cur_time = 0
35+
for _ in range(M):
36+
x,y = map(int,input().split())
37+
adj_f[x].append(y)
38+
adj_b[y].append(x)
39+
visited = [False]*(N+1)
40+
for num in range(1,N+1):
41+
if visited[num]:continue
42+
dfs(num)
43+
visited = [False]*(N+1)
44+
i=0
45+
scc_dict = [0]*(N+1)
46+
for num in finish_time[::-1]:
47+
if visited[num]:continue
48+
scc.append([])
49+
dfs_b(num,i)
50+
i+=1
51+
indegree = [0]*(len(scc)+1)
52+
adj = [[] for _ in range(len(scc)+1)]
53+
visited = [False]*(N+1)
54+
scc.pop()
55+
for idx,sc in enumerate(scc):
56+
for num in sc:
57+
for nx in adj_f[num]:
58+
if nx in sc:continue
59+
adj[idx].append(scc_dict[nx])
60+
indegree[scc_dict[nx]]+=1
61+
q = deque()
62+
for num in range(len(scc)):
63+
if indegree[num]==0:
64+
ans+=1
65+
print(ans)

0 commit comments

Comments
 (0)